HDU 1059(dp46,多重背包)

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;


int dp[500000]; 
int a[7];
int HalfWeight;

void ZeroOne(int weight)
{
    for(int i=HalfWeight;i>=weight;i--)
        dp[i]=max(dp[i],dp[i-weight]+weight);
} 

void Complete(int weight)
{
    for(int i=weight;i<=HalfWeight;i++)
        dp[i]=max(dp[i],dp[i-weight]+weight);
}  

void Multiple(int weight,int number)
{
    if(weight*number>=HalfWeight)
        Complete(weight);
    else
    {
        int k=1;
        while(k1;
        }    
        ZeroOne(number*weight);
    }    
}  

int main()
{
    int c=1;
    while(1)
    {

    int i,j,k;  
    int sum=0;
    for(i=1;i<=6;i++)
        scanf("%d",&a[i]);
    if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0&&a[6]==0)
        return 0;
    for(i=1;i<=6;i++)
        sum+=a[i]*i;
        if(sum%2!=0)
        {
            printf("Collection #%d:\n",c++);
            printf("Can't be divided.\n\n");
        }
    else
    {
        HalfWeight=sum/2;
        memset(dp,0,sizeof(dp));
           for(int i=1;i<=6;i++)
              Multiple(i,a[i]);   
                if(dp[HalfWeight]!=HalfWeight)
                {
                    printf("Collection #%d:\n",c++);
                    printf("Can't be divided.\n\n");
                }
                else
                {
                    printf("Collection #%d:\n",c++);
                    printf("Can be divided.\n\n");
                }
    }
    }
    return 0;
}

你可能感兴趣的:(ACM_HDU,dp46)