1、在上一个基础上优化其状态方程空间:dp[i]:背包大小为i的最大价值
2、状态方程:dp[i]=max(dp[i],dp[i-v[i]]+w[i]),只需注意在遍历空间j时要逆序遍历,防止覆盖错误
#include <iostream>
#include <cmath>
using namespace std;
//物品个数,背包容量
int n,m;
//物品重量,物品价值
int v[15005],w[15005];
//状态保存
int dp[15005];
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=m;j>=v[i];j--){
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
cout<<dp[m];
}