题目:完全背包
文章链接:代码随想录
视频链接:LeetCode:完全背包
题目链接:卡码网题目链接
图释:
#include <iostream>
#include <vector>
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;
int v;
cin >> w >> v;
weight.push_back(w);
value.push_back(v);
}
test_CompletePack(weight, value, V);
return 0;
}
题目:518. 零钱兑换 II
文章链接:代码随想录
视频链接:LeetCode:518.零钱兑换||
题目链接:力扣题目链接
图释:
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];
}
};
题目:377. 组合总和 Ⅳ
文章链接:代码随想录
视频链接:LeetCode:377.组合总和|V
题目链接:力扣题目链接
图释:查看上题图解
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
// 表示总和为i,共有dp[i]种排列组合
vector<int> dp(target+1, 0);
dp[0] = 1;
// sort(nums.begin(), nums.end());
for(int j=0; j<=target; j++){ // 先遍历背包
for(int i=0; i<nums.size(); i++){ // 再遍历物品
// i小于物品数量
if(j - nums[i] >= 0 && dp[j] < INT_MAX - dp[j - nums[i]]){
// 物品重量小于背包容量
dp[j] += dp[j -nums[i]];
}
}
}
return dp[target];
}
};