携带研究材料
[携带研究材料]https://kamacoder.com/problempage.php?pid=1052)
学习记录自代码随想录
要点:1.完全背包问题中物品可以选无数次,所以相比于01背包问题,在遍历背包容量时需要正向遍历
cpp
#include <iostream>
#include <vector>
using namespace std;
class Solution{
public:
int max_value(vector<int>& weight, vector<int>& value, int n, int v){
// 1.dp[j]代表背包容量为j时的最大价值为dp[j]
vector<int> dp(v+1, 0);
// 2.递推公式:dp[j] = max(dp[j], dp[j-weight[i]] + value[i])
// 3.初始化为0同01背包
// 4.遍历顺序因为物品可以选无数次,所以内层遍历背包容量时正向遍历
for(int i = 0; i < n; i++){
for(int j = weight[i]; j < v+1; j++){
dp[j] = max(dp[j], dp[j-weight[i]] + value[i]);
}
}
// 5.举例推导dp数组
return dp[v];
}
};
int main(){
int N, V;
cin >> N >> V;
vector<int> weight(N);
vector<int> value(N);
for(int i = 0; i < N; i++){
int wei, val;
cin >> wei >> val;
weight[i] = wei;
value[i] = val;
}
Solution Solution;
int result = Solution.max_value(weight, value, N, V);
cout << result;
return 0;
}