2维背包
#include<bits/stdc++.h>
using namespace std;int main(){int n,bagweight;cin>>n>>bagweight;vector<int>weight(n,0);vector<int>value(n,0);for(int i = 0 ; i <n;++i){cin>>weight[i];}for(int j = 0;j<n;++j){cin>>value[j];}vector<vector<int>>dp(weight.size(),vector<int>(bagweight + 1,0));for(int j = weight[0] ;j<=bagweight;j++){dp[0][j] = value[0];}for(int i = 1;i < weight.size();i++){for(int j = 0;j<bagweight;j++){if(j < weight[i]) dp[i][j] = dp[i-1][i];else{dp[i][j] = max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);}}}cout<<dp[n-1][bagweight]<<endl;
}
1维背包
#include<iostream>
#include<vector>
using namespace std;int main(){int M,N;cin>>M>>N;vector<int>costs(M);vector<int>values(M);for(int i = 0;i<M;i++){cin>>cost[i];}for(int j = 0;j<M;j++){cin>>values[i];}vector<int>dp(N + 1,0);for(int i = 0;i<M;++i){for(int j = N;j>=costs[i];--j){dp[j] = max(dp[j],dp[j- cost[i]]+ values[i]);i}}cout<<dp[N]<<endl;return 0;
}
416
class Solution {
public:bool canPartition(vector<int>& nums) {int sum = 0;for(int num: nums) sum += num;if(sum % 2 !=0) return false;int n = nums.size();sum = sum / 2;vector<bool>dp(sum + 1,false);dp[0] = true;for(int i = 0 ; i<n;i++){for(int j = sum ; j>=0;j--){if(j - nums[i]>=0){dp[j] = dp[j] ||dp[j-nums[i]];}}}return dp[sum];}
};