HDU 1059多重揹包

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章