[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");
		}
	}
}
posted @ 2018-07-08 08:55  SWHsz  阅读(166)  评论(0编辑  收藏  举报