f[i][j]
:当前物品的最大价值.
max()
:求最大值.
f[i-1][j]
:没有放入第i
件物品的最大价值.
f[i-1][j-w(i)]+c(i)
:放入第i
件物品的最大价值.
综上,比较放入和不放入时物品的最大价值,放入时减少背包容量([j-w(i)]
),增加总价值(+c(i)
)。
更形象的理解:
所以,原来背包的可容纳重量会减少。
// Author:PanDaoxi
#include <iostream>
using namespace std;
// w=重量 c=价值 f=最优解
int w[101],c[101],f[101][101];
int m,n; // m=背包可承受的最大重量 n=可以预估的物品重量及价值
int main(){
cin>>m>>n;
//存入n件物品的重量及价值
for(int i=1;i<=n;i++) cin>>w[i]>>c[i];
//动态规划
for(int i=1;i<=n;i++){ // n件物品
for(int j=1;j<=m;j++){ //最大承受量
//判断当前物品是否可以放入到背包中
if(j>=w[i]) f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+c[i]); //哪个价值大,我们要哪个
else f[i][j]=f[i-1][j]; //否则就不放了
}
}
cout<<f[n][m];
return 0;
}
// Author:PanDaoxi
#include <iostream>
using namespace std;
int w[101],c[101],f[101],m,n;
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++) cin>>w[i]>>c[i];
//动态规划:一维数组
for(int i=1;i<=n;i++){
for(int j=m;j>=0;j--){ //大包不能放入小包
if(j>=w[i]) f[j]=max(f[j],f[j-w[i]]+c[i]);
}
}
cout<<f[m];
return 0;
}
理解如下: