[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");
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/sdfzhsz/p/9279193.html