知识点:一个背包,一个小问题中仅有选与不选两个抉择
1、状态:dp[i][j] 前i件物品再j空间下的最大价值;
2、状态方程:1)空间不足:dp[i][j]=dp[i-1][j](不装第i件物品,与i-1件物品的价值相同);
2)空间足够:dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i])(装第i件物品,要在自己基 础上加上没有装第i件物品时候的最大价值,和不装i件物品时的价值 进行比较);
3、初始化;第0件物品和空间为0的数组置为0;
#include <iostream>
#include <cmath>
using namespace std;
//物品个数,背包容量
int n,m;
//物品重量,物品价值
int v[12805],w[12805];
//状态保存
int dp[12805][12805];
int main(){
//初始化,dp默认为0不用手动初始化
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>v[i]>>w[i];
}
//状态转移
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(j<v[i])
dp[i][j]=dp[i-1][j];
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);
}
}
cout<<dp[n][m];
}