POJ1014 & HDU1059 Dividing

来源:互联网 发布:金山数据恢复 账号 编辑:程序博客网 时间:2024/05/16 00:25

PS:背包类问题。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int maxn = 120000+10;int sum = 0;int a[8];int f[maxn];//Accepted624K16MSC++1457B2014-04-13 15:14:22void all_bag(int c, int w) {    for(int i = c; i <= sum; i++) {        f[i] = max(f[i], f[i-c]+w);    }}void ZeroOneBag(int c, int w) {    for(int i = sum; i >= c; i--) {        f[i] = max(f[i], f[i-c]+w);    }}void mult_bag(int c, int w, int n) {    if(n*c >= sum) {        all_bag(c, w);        return;    }    int k = 1;    while(k < n) {        ZeroOneBag(k*c, k*w);        n -= k;        k *= 2;    }    ZeroOneBag(n*c, n*w);}int main(){    int k = 1;    while(scanf("%d%d%d%d%d%d", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6])==6) {        sum = 0;        for(int i = 1; i <= 6; i++) sum += a[i];        if(!sum) break;        sum = 0;        for(int i = 1; i <= 6; i++) {            sum += i*a[i];        }        if(sum&1) {            printf("Collection #%d:\nCan't be divided.\n\n",k++);            continue;        }        sum /= 2;        memset(f, 0, sizeof(f)); // init;        for(int i = 1; i <= 6; i++) {            if(a[i]) {                mult_bag(i, i, a[i]);            }        }        if(f[sum]==sum) printf("Collection #%d:\nCan be divided.\n\n",k++);        else printf("Collection #%d:\nCan't be divided.\n\n",k++);    }    return 0;}

0 0