01背包问题
#include<iostream>
#include<vector>
using namespace std;int main(){int M;int N;cin>>M>>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<vector<int>> dp(M, vector<int>(N+1,0));for(int i=1; i<=N; i++){if(weight[0]<=i) dp[0][i] = value[0];}for(int i=1; i<=N; i++){for(int j=1; j<M; j++){if(weight[j]>i) dp[j][i] = dp[j-1][i];else dp[j][i] = max(dp[j-1][i], dp[j-1][i-weight[j]]+value[j]);}}cout<<dp[M-1][N]<<endl;return 0;
}
参考文章:代码随想录-01背包问题
01背包问题- 滚动数组
void test_1_wei_bag_problem() {vector<int> weight = {1, 3, 4};vector<int> value = {15, 20, 30};int bagWeight = 4;// 初始化vector<int> dp(bagWeight + 1, 0);for(int i = 0; i < weight.size(); i++) { // 遍历物品for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}}cout << dp[bagWeight] << endl;
}int main() {test_1_wei_bag_problem();
}
参考文章:代码随想录-01背包问题- 滚动数组
416. 分割等和子集
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]);}}if(dp[target]==target){return true;}else{return false;}}
};
参考文章:代码随想录-416. 分割等和子集