hdu1059 Dividing(多重背包)

来源:互联网 发布:查询企业的软件 编辑:程序博客网 时间:2024/05/17 02:37

hdu1059

题目

http://acm.split.hdu.edu.cn/showproblem.php?pid=1059

思路

http://www.cnblogs.com/kuangbin/archive/2012/05/10/2493602.html (对自己说:很奇怪,这题用刚刚的思路就不对了,总之先记一下,以价值记价值)

代码

#include<iostream>#include<cstring>#include<cstdio>#include<vector>#include<queue>#include<algorithm>#include<stack>using namespace std;typedef  long long ll;int f[120005];int v,k;int a[10];void ZeroOnePack(int cost,int weight){    for(int i=v; i>=cost; i--)        if(f[i-cost]+weight>f[i]) f[i]=f[i-cost]+weight;}void CompletePack(int cost,int weight){    for(int i=cost; i<=v; i++)        if(f[i-cost]+weight>f[i]) f[i]=f[i-cost]+weight;}void MultiplePack(int cost,int weight,int amount){    if(cost*amount>=v) CompletePack(cost,weight);    else    {        for(int k=1; k<amount;)        {            ZeroOnePack(k*cost,k*weight);            amount-=k;            k<<=1;        }        ZeroOnePack(amount*cost,amount*weight);    }}int main(){    int tol;    int kase=1;    while(1)    {        tol=0;        for(int i=1; i<7; i++)        {            scanf("%d",&a[i]);            tol+=a[i]*i;        }        if(tol==0) break;        if(tol%2==1)        {            printf("Collection #%d:\nCan't be divided.\n\n",kase++);            continue;        }        else        {            v=tol/2;            memset(f,0,sizeof(f));            for(int i=1; i<7; i++)                MultiplePack(i,i,a[i]);            if(f[v]==v)                printf("Collection #%d:\nCan be divided.\n\n",kase++);            else printf("Collection #%d:\nCan't be divided.\n\n",kase++);        }    }    return 0;}
0 0
原创粉丝点击