
链接:
题解:
dpij 表示前i个物品,凑出不超过j大小,获得最大的价值是多少
cpp
class Solution {
public:
/**
* @param a: an integer array
* @param v: an integer array
* @param m: An integer
* @return: an array
*/
int backPackIII(vector<int> &a, vector<int> &v, int m) {
// write your code here
int len = a.size();
if (len <= 0) {
return 0;
}
vector<vector<int>> dp(len + 1, vector<int>(m + 1, 0));
// dp[0][j] = 0:没有物品,任何容量下价值都是 0
for (int i = 1; i <= len; ++i) {
for (int j = 0; j <= m; ++j) {
dp[i][j] = dp[i - 1][j]; // 不选第 i 个
if (j >= a[i - 1]) {
dp[i][j] = max(dp[i][j],
dp[i][j - a[i - 1]] + v[i - 1]); // 选第 i 个
}
}
}
return dp[len][m]; // ✅ 直接返回
}
};
dpij前i个物品凑出j个大小的背包,获得的价值是多少
cpp
class Solution {
public:
/**
* @param a: an integer array
* @param v: an integer array
* @param m: An integer
* @return: an array
*/
int backPackIII(vector<int> &a, vector<int> &v, int m) {
// write your code here
int len = a.size();
if (len <= 0) {
return 0;
}
vector<vector<int>> dp(len+1, vector<int>(m+1, INT_MIN));
dp[0][0] = 0;
for (int i = 1; i <= len; ++i) {
for (int j = 0; j <= m; ++j) {
dp[i][j] = dp[i-1][j];
if (j - a[i-1] >= 0) {
dp[i][j] = max(dp[i][j], dp[i][j-a[i-1]] + v[i-1]);
}
}
}
int result = INT_MIN;
for (int i = 0; i <= m; ++i) {
result = max(result, dp[len][i]);
}
return result;
}
};