• [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
  • 相关阅读:
    组合总和
    子集Ⅱ
    子集
    全排列Ⅱ
    全排列
    填充下一个结点下一个Next结点
    把二叉树转化成累加树
    二叉树的左叶子之和
    高速C/C++编译工具ccache
    【转载】如何用U盘制作Ubuntu启动盘
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9279193.html
Copyright © 2020-2023  润新知