动态规划中的经典题01背包
最近在练习动态规划希望自己能理解更透彻
输入样式:
4 6 1 4 2 6 3 12 2 7
输出样式:
23
我提交的代码:
#include<stdio.h>
int max(int x,int y){
if(x<y){
return y;
}
else{
return x;
}
}
int main()
{
int w[3410],v[3410];//w数组存重量,v数组存价值(魅力值)
int f[13000];//f数组表示背包中物体的价值
int i,j;
int n,m;//m是最大重量
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++){
scanf("%d",&w[i]);//输入物体i的重量w[i]
scanf("%d",&v[i]);//输入物体i的价值v[i]
}
f[0]=0;//边界状态,背包中没有物体价值为0
for(i=1;i<=n;i++){//从后向前找不会有其它影响
for(j=m;j>=w[i];j--){//m为背包所能装的最大重量,j为背包中物品的重量
f[j]=max(f[j-w[i]]+v[i],f[j]);//两种状态(选择装入物品i,或者选择不装入i)
}//若选择不装入物品i,背包中物品最大价值不变仍然是f[j]
}//若选择装入物品i,背包中物品重量j-w[i],此时背包物品最大价值f[j-w[i]]+v[i];
printf("%d",f[m]);//输出背包中物品最大价值f[m]
return 0;
}