[POJ1014]Dividing(二进制优化多重背包)
Posted void-f
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[POJ1014]Dividing(二进制优化多重背包)相关的知识,希望对你有一定的参考价值。
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; int T,A[10]; bool f[100010]; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } int main(){ for(;;){ int s=0,fg=0; for(int i=1;i<=6;++i)A[i]=read(),s+=A[i]*i; if(!s)break; printf("Collection #%d: ",++T); if(s&1^1){//原来打成s^1&1WA了233 s>>=1,memset(f,0,sizeof(f)),f[0]=1; for(int i=1;i<=6;++i){ for(int j=1;j<=A[i];j*=2){ for(int k=s;k>=j*i;--k)if(f[k-j*i])f[k]=1; A[i]-=j; } if(A[i])for(int k=s;k>=A[i]*i;--k)if(f[k-A[i]*i])f[k]=1; } if(f[s])fg=1; } if(fg)printf("Can be divided. ");else printf("Can‘t be divided. "); } return 0; }
以上是关于[POJ1014]Dividing(二进制优化多重背包)的主要内容,如果未能解决你的问题,请参考以下文章
POJ 1014 / HDU 1059 Dividing 多重背包+二进制分解