YAIMH1993的笔记
如果奇迹木有出现,就去创造一个
posts - 29,comments - 0,trackbacks - 0
#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 2012-10-23 21:38 YouAreInMyHeart 阅读(125) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理