hdu 1059

来源:互联网 发布:vivo网络授权书怎么 编辑:程序博客网 时间:2024/05/01 12:29

多重背包二进制拆分思想

#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <algorithm>#include <cmath>#include <stack>#include <vector>#define LL long long#define myabs(x) ((x)>0?(x):(-(x)))using namespace std;const int inf=0x3f3f3f3f;int s[7];int f[20000*6+10];int main(){int cas=0;while(true){int i,sum=0;for(i=1;i<=6;i++){scanf("%d",&s[i]);sum+=s[i]*i;}if(!s[1]&&!s[2]&&!s[3]&&!s[4]&&!s[5]&&!s[6]) break;printf("Collection #%d:\n",++cas);if(sum%2) {printf("Can't be divided.\n\n");continue;}sum/=2;memset(f,0,sizeof(f));f[0]=1;int j,k,tem;for(i=1;i<=6;i++){for(k=1,tem=0;(tem+k)<=s[i];k<<=1){tem+=k;for(j=sum;j>=k*i;j--)f[j]|=f[j-k*i];}if(tem<s[i]){tem=s[i]-tem;for(j=sum;j>=tem*i;j--)f[j]|=f[j-tem*i];}}if(f[sum]) printf("Can be divided.\n\n");else printf("Can't be divided.\n\n");}return 0;}