完全背包
完全背包
视频讲解:https://www.bilibili.com/video/BV1uK411o7c9
https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85.html
#include <bits/stdc++.h>
using namespace std;
void test_CompletePack(vector<int> weight, vector<int> value, int bagweight) {
vector<int> dp(bagweight+1,0);
for(int j=0;j<=bagweight;j++) {
for(int i=0;i<weight.size();i++) {
if(j-weight[i] >= 0)
dp[j] = max(dp[j],dp[j-weight[i]]+value[i]);
}
}
cout<<dp[bagweight] << endl;
}
int main() {
int N,V;
cin>>N>>V;
vector<int> weight;
vector<int> value;
for(int i=0;i<N;i++) {
int w,v;
cin>>w>>v;
weight.push_back(w);
value.push_back(v);
}
test_CompletePack(weight,value,V);
return 0;
}
- 零钱兑换 II
视频讲解:https://www.bilibili.com/video/BV1KM411k75j
https://programmercarl.com/0518.%E9%9B%B6%E9%92%B1%E5%85%91%E6%8D%A2II.html
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> dp(amount+1,0);
dp[0] = 1;
for(int i=0;i<coins.size();i++) {
for(int j=coins[i];j<=amount;j++) {
dp[j] += dp[j-coins[i]];
}
}
return dp[amount];
}
};
- 组合总和 Ⅳ
视频讲解:https://www.bilibili.com/video/BV1V14y1n7B6
https://programmercarl.com/0377.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C%E2%85%A3.html
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int> dp(target+1,0);
dp[0] = 1;
for(int i=0;i<=target;i++) {
for(int j=0;j<nums.size();j++) {
if(i-nums[j]>=0 && dp[i]<INT_MAX-dp[i-nums[j]]) //&& dp[i]<INT_MAX-dp[i-nums[j]]
dp[i] += dp[i-nums[j]];
}
}
return dp[target];
}
};