C++背包问题_c++
C++背包问题_c++_02
C++背包问题_ios_03
C++背包问题_c++_04
C++背包问题_i++_05
C++背包问题_开发语言_06
C++背包问题_后端_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++背包问题_c++_08

C++背包问题_ios_09
C++背包问题_c++_10
C++背包问题_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++背包问题_开发语言_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++背包问题_开发语言_14