http://acm.hdu.edu.cn/showproblem.php?pid=1059

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int a[7];
int dp[121111];
int v,k;
void ZeroOnePack(int cost,int weight) {
    for(int i=v;i>=cost;i--)
        dp[i] = max(dp[i] , dp[i-cost] + weight);    
}
void CompletePack(int cost,int weight) {
    for(int i=cost;i<=v;i++)
        dp[i] = max(dp[i] , dp[i-cost] + weight);    
}
void MultiplePack(int cost,int weight,int amount) {
    if(cost * amount >= v) CompletePack(cost,weight);
    else {
        for(int k=1;k<amount;) {
            ZeroOnePack(k*cost,k*weight);
            amount -= k;
            k <<= 1;    
        }    
        ZeroOnePack(amount*cost,amount*weight);
    }  
}
int main() {
    int cas = 1;
    while(1) {
        int tot = 0;
        for(int i=1;i<=6;i++) {
            scanf("%d",&a[i]);
            tot += a[i] * i;
        }    
        if(tot == 0) break;
        printf("Collection #%d:\n",cas++);
        if(tot % 2) puts("Can't be divided.");
        else {
            v = tot / 2;
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=6;i++) {
                MultiplePack(i,i,a[i]);    
            }    
            if(dp[v] == v) puts("Can be divided.");
            else puts("Can't be divided.");
        }
        puts("");
    }
    return 0;    
}

  

 posted on 2013-09-26 23:08  tobec  阅读(155)  评论(0编辑  收藏  举报