C++背包问题_c++

C++背包问题_开发语言_02

C++背包问题_开发语言_03

C++背包问题_c++_04

C++背包问题_i++_05

C++背包问题_开发语言_06

C++背包问题_i++_07


​f[i][j]​​:​当前物品的最大价值.

​max()​​:求最大值.

​f[i-1][j]​​:​没有放入第​​i​​件物品的最大价值.

​f[i-1][j-w(i)]+c(i)​​:​放入第​​i​​件物品的最大价值.

综上,比较放入和不放入时物品的最大价值,放入时减少背包容量(​​[j-w(i)]​​​),增加总价值(​​+c(i)​​)。

更形象的理解:

C++背包问题_后端_08

C++背包问题_ios_09

C++背包问题_c++_10

C++背包问题_开发语言_11

所以,原来背包的可容纳重量会减少。

C++背包问题_ios_12


// 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;
}

C++背包问题_c++_13

// 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;
}

理解如下:

C++背包问题_c++_14