1267:【例9.11】01背包问题
一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn,求旅行者能获得最大总价值。
第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30);
第2..N+12..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。
仅一行,一个数,表示最大总价值。
······(此处省略999+字)
看了上面的内容,大家一定知道了什么是01背包了吧。
好,我们分析一下题目:
设f[i][v]表示前i件物品,总重量不超过v的最优值
所以:
则f[n][m]为最优解。
下面是代码环节:
#include<cstdio>
using namespace std;
const int maxm=201,maxn=31;
int m,n;
int w[maxn],c[maxn];
int f[maxn][maxm];
int max(int x,int y)
int max(int x,int y){
}
int main(){
}
这是主框架↑
顾名思义,有max函数,里面的代码,我就不多说了。
int max(int x,int y){
if(x<y) return y;
else return x;
}
main里的代码
int main(){
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++) scanf("%d%d",&w[i],&c[i]);
//上面的是输入
for(int i=1;i<=n;i++){
for(int v=m;v>0;v--){
if(w[i]<=v) f[i][v]=max(f[i-1][v],f[i-1][v-w[i]]+c[i]);
else f[i][v]=f[i-1][v];
}
}
//
//f[i][v]表示前i件物品,总重量不超过v的最优值,套公式就可以
printf("%d",f[n][m]);
// f[n][m]为最优解。
return 0;
}
连起来的代码(图片):
当然这不是最好的方法。
更好的方法,代码当然少,不用写函数:
这个方法优化了空间复杂度,保对。
第一种方法↑
第二种方法↑