[tyvj-1194]划分大理石 二进制优化多重背包
突然发现这个自己还不会。。。
其实也不难,就和快速幂感觉很像,把物品数量二进制拆分一下,01背包即可
我是咸鱼
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[7],ave,sum;
bool f[120005];
void bag01(int w) {
for(int j=ave; j>=w; j--)
if(f[j-w]) f[j]=1;
}
void Mutibag(int c,int w) {
int k=1;
if(c==1) {
bag01(w);
return;
}
while(k<c) {
bag01(k*w);
c-=k;
k<<=1;
}
if(c) bag01(c*w);
}
int main() {
while(1) {
sum=0;
for(int i=1; i<=6; i++) scanf("%d",&a[i]),sum+=a[i]*i;
if(sum==0) return 0;
if(sum&1) puts("Can't");
else {
ave=sum>>1;
memset(f,0,sizeof f);
f[0]=1;
for(int i=1; i<=6; i++) Mutibag(a[i],i);
if(f[ave]) puts("Can");
else puts("Can't");
}
}
}
我是咸鱼。转载博客请征得博主同意Orz