HDU 1059 Dividing(多重背包)

来源:互联网 发布:淘宝评论怎么没有了 编辑:程序博客网 时间:2024/06/05 07:42

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1059

思路:简单多重背包,按照题目数据开的数组,结果RE了,果断开大,直接过了

AC代码:

#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <cstring>#include <climits>#include <cmath>#include <cctype>const int inf = 0x3f3f3f3f;//1061109567typedef long long LL;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;int a[10];int dp[100100];int sum;void complete_pack(int value){    for(int i=value; i<=sum; i++)        dp[i] = max(dp[i],dp[i-value]+value);}void zeroone_pack(int value){    for(int i=sum; i>=value; i--)        dp[i] = max(dp[i],dp[i-value]+value);}void multi_pack(){    for(int i=1; i<=6; i++)    {        if(a[i] * i >= sum)            complete_pack(i);        else        {            int k = 1;            int count1 = a[i];            while(k < count1)            {                zeroone_pack(k*i);                count1 -= k;                k *= 2;            }            zeroone_pack(count1*i);        }    }}int main(){    int cas =  1;    while(true)    {        sum = 0;        memset(dp,0,sizeof(dp));        for(int i=1; i<=6; i++)        {            scanf("%d",&a[i]);            sum += (a[i] * i);        }        if(sum == 0)            break;        printf("Collection #%d:\n",cas++);        if(sum & 1)        {            printf("Can't be divided.\n\n");            continue;        }        sum /= 2;        multi_pack();        if(dp[sum] == sum)            printf("Can be divided.\n\n");        else            printf("Can't be divided.\n\n");    }    return 0;}


0 0
原创粉丝点击