HDU 1059多重背包

来源:互联网 发布:cad软件自学教程 编辑:程序博客网 时间:2024/05/06 02:20
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=200005;int cost[10],value[10];int f[maxn];int a[7];int v;void zeropack(int cost1,int value1){    for(int i=v; i>=cost1; i--)    {        f[i]=max(f[i],f[i-cost1]+value1);    }}void completpack(int cost1,int value1){    for(int i=cost1; i<=v; i++)    {        f[i]=max(f[i],f[i-cost1]+value1);    }}void multiplepack(int cost1,int value1,int acount1){    if(cost1*acount1>v)    {        completpack(cost1,value1);        return;    }    else    {        int k=1;        while(k<acount1)        {            zeropack(k*cost1,k*value1);            acount1-=k;            k*=2;        }        zeropack(acount1*cost1,acount1*value1);    }}int main(){    int i,j;    int tcase=0;    while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]),a[1]+a[2]+a[3]+a[4]+a[5]+a[6])    {        int sum;        sum=a[1]*1+a[2]*2+a[3]*3+a[4]*4+a[5]*5+a[6]*6;        if(sum%2)        {            printf("Collection #%d:\n",++tcase);            printf("Can't be divided.\n\n");            continue;        }        v=sum/2;        memset(f,0,sizeof(f));        for(i=1; i<=6; i++)        {            multiplepack(i,i,a[i]);        }        if(f[v]==v)        {            printf("Collection #%d:\n",++tcase);            printf("Can be divided.\n\n");        }        else        {            printf("Collection #%d:\n",++tcase);            printf("Can't be divided.\n\n");        }    }    return 0;}

原创粉丝点击