下面代码中p[i][j]的含义为,背包容量为j时前i个物品放进去的最大价值,
1.如果第i个物品放不进去即weight[i]>j,那么p[i][j]=p[i-1][j],
2.如果weight[i]<=j,那么p[i][j]=max(p[i-1][j],p[i-1][j-weight[i]]+value[i]),就是取“不放第i个进去”与放第i个进去的最大值。
经过循环之后,最后得到想要的结果
#include<iostream>
#include<vector>
using namespace std;
vector<int> weight;
vector<int> value;
int main(){
int n;
cin>>n;
int w,v;
weight.push_back(0);
value.push_back(0);
for(int i=1;i<=n;i++){
cin>>w>>v;
weight.push_back(w);
value.push_back(v);
}
int maxWeight;
cin>>maxWeight;
int **p=new int*[n+1];
for(int i=0;i<n+1;i++){
p[i]=new int[maxWeight+1];
}
for(int i=0;i<=n;i++){
for(int j=0;j<=maxWeight;j++){
p[i][j]=0;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=maxWeight;j++){
if(weight[i]>j){
p[i][j]=p[i-1][j];
}else{
p[i][j]=max(p[i-1][j],p[i-1][j-weight[i]]+value[i]);
}
}
}
cout<<p[n][maxWeight];
}