HDOJ1059

来源:互联网 发布:智能制造仿真软件 编辑:程序博客网 时间:2024/06/06 01:06

多重背包

#include <stdio.h>#include <string.h>#define mymax(a, b) (a>b) ? a:bint c[7];int dp[60000];void ZeroOnePack(int c, int v) {    int i;    for (i=v; i>=c; --i)        dp[i] = mymax(dp[i], dp[i-c]);}void CompletePack(int c, int v) {    int i;    for (i=c; i<=v; ++i)        dp[i] = mymax(dp[i], dp[i-c]);}void MultiPack(int c, int n, int v) {    int k = 1;    if (c*n >= v) {        CompletePack(c, v);        return ;    }    while (k < n) {        ZeroOnePack(k*c, v);        n -= k;        k *= 2;    }    ZeroOnePack(n*c, v);}int main() {    int t = 0, total;    int i;    while ( 1 ) {        total = 0;        for (i=1; i<=6; ++i) {            scanf("%d", &c[i]);            total += c[i]*i;        }        if (total == 0)            break;        printf("Collection #%d:\n", ++t);        if (total & 1) {            printf("Can't be divided.\n\n");            continue;        }        total >>= 1;        memset(dp, 0, sizeof(dp));        dp[0] = 1;        for (i=1; i<=6; ++i) {            MultiPack(i, c[i], total);            if (dp[total])                break;        }        if (dp[total])            printf("Can be divided.\n\n");        else            printf("Can't be divided.\n\n");    }    return 0;}


0 0
原创粉丝点击