代码随想录算法训练营第44天 | 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ

一、完全背包

跟01背包类似,当时也讲了,只是把容量遍历变成正序即可。
母版如下:

// 先遍历物品,在遍历背包
void test_CompletePack() {
    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 = weight[i]; j <= bagWeight; j++) { // 遍历背包容量
            dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
        }
    }
    cout << dp[bagWeight] << endl;
}
int main() {
    test_CompletePack();
}
  1. 两个for循环的先后是否可以颠倒?
    答:纯完全背包问题当然可以,都在左上角。

二、Leetcode 518. 零钱兑换 II

如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。

三、Leetcode 377. 组合总和 Ⅳ

C++测试用例有两个数相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。

你可能感兴趣的:(刷题,算法)