hdu 1059 Dividing(多重DP)

来源:互联网 发布:微信相关软件 编辑:程序博客网 时间:2024/06/08 08:22

点击打开链接

题目意思:

有各种物品,各自的价值为1,2,3,4,5,6;

给出各自的数目,判断能否将其平分。

使用母函数的话,果断超时。

所以才用多重背包,这里需要剪枝一下了。

#include"stdio.h"#include"string.h"int dp[60011];int main(){    int num[7];    int i,l,k;    int sum;    int total;    int Case=1;    while(scanf("%d",&num[1])!=-1)    {        sum=num[1];        for(i=2;i<7;i++)        {            scanf("%d",&num[i]);            sum+=num[i]*i;        }        if(sum==0)break;        if(sum%2==1)        {            printf("Collection #%d:\n",Case++);            printf("Can't be divided.\n\n");            continue;        }        total=sum/2;        for(l=1;l<=total;l++)            dp[l]=0;        for(k=0;k<=num[1]&&k<=total;k++)            dp[k]=1;        for(i=2;i<7;i++)        {            for(l=total;l>=0;l--)            {                if(dp[l]==0)continue;                for(k=1;k<=num[i]&&k<=total;k++)                {                    if(dp[k*i+l])break;                    dp[k*i+l]=1;                }            }        }        if(dp[total])        {            printf("Collection #%d:\n",Case++);            printf("Can be divided.\n\n");        }        else        {            printf("Collection #%d:\n",Case++);            printf("Can't be divided.\n\n");        }    }    return 0;}