简单的0-1背包问题二维数组
原理
i*j的矩阵,i表示物品(从0到i-1,j表示容量(从0到vol))
dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,vol;
int j,k;
cin>>n;
cin>>vol;
vector<int> weight(n,0);
vector<int> value(n,0);
for(int i = 0; i < n; i++) {
cin >> weight[i];
}
for(int j = 0; j < n; j++) {
cin >> value[j];
}
vector<vector<int>> dp(n,vector<int>(vol+1));
//初始化dp[0][j]
//放不下weight[0]
for(int i=0;i<weight[0];i++){
dp[0][i]=0;
}
//放得下weight[0]
for(int i=weight[0];i<=vol;i++){
dp[0][i]=value[0];
}
//初始化dp[i][0]
for(int i=0;i<n;i++){
dp[i][0]=0;
}
for(int i=1;i<n;i++){
for(j=1;j<=vol;j++){
if(j<weight[i]){
dp[i][j]=dp[i-1][j];
}
else{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);
}
}
}
cout<<dp[n-1][vol];
return 0;
}