dp之多重背包hdu1059

题意:价值为1,2,3,4,5,6. 分别有n[1],n[2],n[3],n[4],n[5],n[6]个。求能否找到满足价值刚好是所有的一半的方案。

思路:简单的多重背包,我建议多重背包都用二进制拆分优化下........

 

#include<iostream>

#include<stdio.h>

#include<string.h>

using namespace std;

int dp[200000],w[200000];

int main()

{

    int t[7],text=0;

    while(1)

    {

        int sum=0;

        for(int i=1;i<=6;i++)

        {

            scanf("%d",&t[i]);

            sum+=i*t[i];

        }

        if(sum==0)

        break;

        printf("Collection #%d:\n",++text);

        if(sum%2==1)

        {

            printf("Can't be divided.\n\n");

            continue;

        }

        sum/=2;

        int cnt=0;

        for(int i=1;i<=6;i++)

        {

            int k=1;

            while(t[i]-k>0)

            {

                w[cnt++]=k*i;

                t[i]-=k;

                k*=2;

            }

            w[cnt++]=t[i]*i;

        }

        memset(dp,0,sizeof(dp));

        for(int i=0;i<cnt;i++)

        {

            for(int j=sum;j>=w[i];j--)

            if(dp[j]<dp[j-w[i]]+w[i])

            dp[j]=dp[j-w[i]]+w[i];

        }

        if(dp[sum]==sum)

        printf("Can be divided.\n");

        else

        printf("Can't be divided.\n");

        printf("\n");

    }

    return 0;

} 

 

 

 

你可能感兴趣的:(HDU)