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

518. 零钱兑换 II

力扣题目链接

思路

  • dp[j] 表示装满背包容量为j的最大方法数
  • 递推公式:dp[j]=dp[j]+dp[j-coins[i]];
  • 初始化:dp[0]=1;
  • 遍历顺序:先物品,后背包,正序遍历
  • 如果求组合数就是外层for循环遍历物品,内层for遍历背包。
  • 如果求排列数就是外层for遍历背包,内层for循环遍历物品。

代码

class Solution {
public:
    /*
     * dp[j] 表示装满背包容量为j的最大方法数
     * 递推公式:dp[j]=dp[j]+dp[j-coins[i]];
     * 初始化:dp[0]=1;
     * 遍历顺序:先物品,后背包,正序遍历
    */
    int change(int amount, vector& coins) {
        vector dp(amount+1);
        dp[0]=1;
        for(int i=0;i
  • 时间复杂度O(amount*n)
  • 空间复杂度O(amount)

377. 组合总和 Ⅳ

力扣题目链接

思路

  • dp[j] 表示和为j的最大组合数
  • 递推公式:dp[j]=dp[j]+dp[j-nums[i]];
  • 初始化:dp[0]=1;
  • 遍历顺序:先背包,后物品,正序遍历

代码

class Solution {
public:
    /*
     * dp[j] 表示和为j的最大组合数
     * 递推公式:dp[j]=dp[j]+dp[j-nums[i]];
     * 初始化:dp[0]=1;
     * 遍历顺序:先背包,后物品,正序遍历
    */
    int combinationSum4(vector& nums, int target) {
        vector dp(target+1);
        dp[0]=1;
        for(int j=1;j<=target;j++){
            for(int i=0;i=nums[i]&&dp[j]
  • 时间复杂度O(n*target)
  • 空间复杂度O(target)

你可能感兴趣的:(代码随想录刷题,算法,leetcode,动态规划)