01背包,完全背包, 多重背包
2011-04-24 00:43
253 查看
多重背包伪代码如下:
fori=1..N
/*
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;
}
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:
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:
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;
}
相关文章推荐
- 01背包和完全背包
- hdoj5410CRB and His Birthday【01背包+完全背包】
- 学习笔记-01背包、完全背包、多重背包
- 01背包问题和完全背包问题
- 背包DP(01背包问题,完全背包问题) 经典题
- 背包问题入门 01背包和完全背包
- 01背包 完全背包
- 背包问题 01背包 完全背包 多重背包
- 经典背包问题 01背包+完全背包+多重背包
- 01背包问题和完全背包问题
- 01背包,完全背包,多重背包
- 浅谈01背包和完全背包
- 关于01背包和完全背包二重循环的顺序(前人之技,后人惊叹)
- 01背包和完全背包
- 01背包问题和完全背包问题
- poj 1276 (完全背包二进制转化01背包)
- 背包问题—01背包、完全背包
- 01背包 完全背包 多重背包
- 01背包、完全背包、多重背包模版。
- 背包问题(1)——01背包、完全背包、多重背包、混合三种背包问题