HDU 1059 Dividing

来源:互联网 发布:淘宝买苹果8可靠吗 编辑:程序博客网 时间:2024/06/07 03:13

多重背包,模板题,直接上代码

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int a[10],dp[300005];int main(){    int kase = 1;    while(scanf("%d", &a[1]) != EOF)    {        int sum = a[1];        for(int i = 2; i <= 6; i++)        {            scanf("%d", &a[i]);            sum += i*a[i];        }        if(!sum) break;        printf("Collection #%d:\n", kase++);        if(sum & 1)        {            printf("Can't be divided.\n\n");            continue;        }        sum /= 2;        memset(dp, 0, sizeof(dp));        for(int i = 1; i <= 6; i++)        {            if(i*a[i] >= sum)            {                for(int j = i; j <= sum; j++)                    dp[j] = max(dp[j], dp[j-i] + i);                continue;            }            for(int k = 1; k <= a[i]; k *= 2)            {                for(int j = sum; j >= k*i; j--)                    dp[j] = max(dp[j], dp[j - k*i] + k*i);                a[i] -= k;            }            if(a[i] > 0)                for(int j = sum; j >= a[i]*i; j--)                    dp[j] = max(dp[j], dp[j - a[i]*i] + a[i]*i);        }        if(dp[sum] == sum) printf("Can be divided.\n");        else printf("Can't be divided.\n");        printf("\n");    }    return 0;}
1 0
原创粉丝点击