hdu 1059 Dividing (多重背包)

来源:互联网 发布:三菱plc如何编程视频 编辑:程序博客网 时间:2024/06/04 19:52
/*多重背包*/#include<iostream>#include<cstring>#include<cstdio>#define max(a,b) a>b?a:b#define N 60001using namespace std;int a[7],sum,index;char f[N];int main(){    freopen("test.txt","r",stdin);    index=0;    while(true)    {        sum=0;        for(int i=1;i<=6;i++)        {            scanf("%d",&a[i]);            sum+=a[i]*i;        }        if(!sum)            break;        printf("Collection #%d:\n",++index);        if(sum%2!=0)        {            printf("Can't be divided.\n");        }        else        {            sum/=2;            memset(f,0,sizeof(f));            f[0]=1;            for(int i=1;i<=6;i++)            {                if(a[i]*i>=sum)                {                    for(int j=i;j<=sum;j++)                    {                        f[j]|=f[j-i];//这里省时。                    }                }                else                {                    int k=1;                    while(k<a[i])                    {                        for(int j=sum;j>=k*i;j--)                        {                            f[j]|=f[j-k*i];                        }                        a[i]-=k;                        k*=2;                    }                    k=a[i];                        for(int j=sum;j>=k*i;j--)                        {                            f[j]|=f[j-k*i];                        }                }            }            if(f[sum])                printf("Can be divided.\n");            else                printf("Can't be divided.\n");        }        printf("\n");    }}

原创粉丝点击