您的位置:首页 > 其它

01背包,完全背包, 多重背包

2011-04-24 00:43 253 查看
多重背包伪代码如下:

fori=1..N

forv=0..V

f[v]=max{f[v],f[v-weight[i]]+value[i]}

注意是顺序结构的;


01背包伪代码:


fori=1..N

forv=V..0

f[v]=max{f[v],f[v-weight[i]]+value[i]};

注意是逆序结构的;其中v代表当前背包的重,也就是说,v是从weight[i]或者是volumn[i]开始的


例子就拿HDU2602Bonecollector------------01背包题型

/*
title:Piggy-Bank
URL:http://acm.hdu.edu.cn/showproblem.php?pid=1114byAnthoyDu

Problem:1114(Piggy-Bank)JudgeStatus:Accepted
RunId:3862008Language:C++Author:a312745658
CodeRenderStatus:RenderedByHDOJC++CodeRenderVersion0.01Beta

*/
#include<iostream>
#include<string.h>
usingnamespacestd;
#defineINF1000000001

intmax(intx,inty)
{
returnx<y?x:y;
}
intdp[10005],value[502],weight[502];
intmain()
{
intTcase,E,F,num;
inti,j,k,Max;
cin>>Tcase;
while(Tcase--)
{
cin>>E>>F;
cin>>num;
for(i=0;i<num;i++)
cin>>value[i]>>weight[i];
for(i=1;i<=F-E;i++)
dp[i]=INF;
dp[0]=0;
for(i=0;i<num;i++)
for(j=weight[i];j<=F-E;j++)
{
dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);
}
if(dp[F-E]==INF)
cout<<"Thisisimpossible."<<endl;
else
cout<<"Theminimumamountofmoneyinthepiggy-bankis"<<dp[F-E]<<"."<<endl;
}

}[/code]

再晒一题,因为现在貌似把多重背包弄懂了。

/*
title:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
Url:http://acm.hdu.edu.cn/showproblem.php?pid=2191--------------------------
byAnthonyDu
-------------------------
题型:多重背包
Problem:2191(悼念512汶川大地震遇难同胞——珍惜现在,感恩生活)JudgeStatus:Accepted
RunId:3862308Language:C++Author:a312745658
*/
#include<iostream>
#include<string.h>
usingnamespacestd;

intMAX(intx,inty)
{
returnx>y?x:y;
}
intdp[10005],value[102],weight[102],number[102];
intmain()
{
intTcase,money,kind;
inti,j,k,max;
cin>>Tcase;
while(Tcase--)
{
memset(dp,0,sizeof(dp));
cin>>money>>kind;
for(i=0;i<kind;i++)
cin>>value[i]>>weight[i]>>number[i];
for(i=0;i<kind;i++)
for(j=0;j<number[i];j++)//与完全背包相比,就只有多一步这个,就是枚举每类大米有限袋的情况
for(k=money;k>=value[i];k--)
dp[k]=MAX(dp[k],dp[k-value[i]]+weight[i]);
cout<<dp[money]<<endl;
}
return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: