题目1:二维dp数组求 01 背包46. 携带研究材料(第六期模拟笔试) (kamacoder.com)
#include<iostream>
#include<vector>
using namespace std;
int main() {
int n,bagweight;
cin >> n >> bagweight;
vector<int> weight(n);
vector<int> val(n);
for(int i = 0;i < n;i++) {
cin >> weight[i];
}
for(int i = 0;i < n;i++) {
cin >> val[i];
}
vector<vector<int>> dp(n, vector<int>(bagweight + 1, 0));
for(int i = 0;i < n;i++) {
dp[i][0] = 0;
}
for(int i = weight[0];i < bagweight + 1;i++) {
dp[0][i] = val[0];
}
for(int i = 1;i < n;i++) {
for(int j = 0;j <= bagweight;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]] + val[i]);
}
}
cout << dp[n - 1][bagweight] << endl;
return 0;
}
题目2:一维dp数组求背包\
题目3:416. 分割等和子集 - 力扣(LeetCode)
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for(int i = 0;i < nums.size();i++) {
sum += nums[i];
}
if(sum % 2 == 1) return false;
int target = sum / 2;
vector<int> dp(target + 1, 0);
for(int i = 0;i < nums.size();i++) {
for(int j = target;j >= nums[i];j--) {
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
}
}
return dp[target] == target ? true : false;
}
};