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. 分割等和子集