1
1
1
1
忘记发题目地址了
46. 携带研究材料(第六期模拟笔试) (kamacoder.com)
二维
#include <bits/stdc++.h>
using namespace std;
int m,n;
int main(){
cin>>m>>n;//m为种类 即物品种类 或者个数 然后下面一行是空间 再下面一行是价值 n是背包内存
int bagweight=n;
vector<int>value(m,0);
vector<int>weight(m,0);
vector<vector<int>>dp(m,vector<int>(bagweight+1,0));//构建m行 物品个数 bagweight+1个列 +1很重要 因为+1开始的0初始化的
for(int j=0;j<m;j++){ //时候第一列0开头的那一列直接赋值为0 因为没有weight=0所以value直接为0
cin>>weight[j];
}
for(int j=0;j<m;j++){
cin>>value[j];
}
//先初始化 一行
//0开头的那一列已经在二维数组dp创建的时候就默认搞好了
for(int i=weight[0];i<=bagweight;i++){
dp[0][i]=value[0];
}
//开始进行后续的构建
for(int i=1;i<m;i++){//因为m有六个 但是从0开始 所以 1 2 3 4 5即可
for(int j=0;j<=bagweight;j++){//背包只有1个大小 又是从0开始 所以 0 1 可以等于1 即背包大小
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[m-1][bagweight]<<endl;
}
一维
#include <bits/stdc++.h>
using namespace std;
int m,n;
int main(){
cin>>m>>n;
int bagweight=n;
vector<int>weight(m,0);
vector<int>value(m,0);
for(int i=0;i<m;i++){
cin>>weight[i];
}
for(int i=0;i<m;i++){
cin>>value[i];
}
vector<int>dp(n+1,0);//一维数组dp里面的变量dp[j]意思就是j内存下的最大价值
for(int i=0;i<m;i++){
for(int j=bagweight;j>=weight[i];j--){
dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);
}
}
cout<<dp[bagweight]<<endl;
}