day-44 代码随想录算法训练营(19) 动态规划 part 06

518.零钱兑换 ||

分析:还是没太懂
思路:
  • 1.dp存储,金额为j时,组合的方法有dp[j]种
  • 2.dp[j]+=dp[j-coins[i]]  只有加conins[i]能达到金额j的都行
  • 3.全部初始化为0
  • 4.遍历顺序:外层遍历硬币,内层遍历金额
class Solution {
public:
    int change(int amount, vector& coins) {

        int n=coins.size();
        vectordp(amount+1,0);
        dp[0]=1;
        for(int i=0;i

377.组合总和IV

思路:
  • 1.dp存储:和为j,组成的组合有dp[j]种
  • 2.dp+=dp[j-nums[i]]
  • 3.dp[0]=1
  • 4.遍历顺序:外层遍历背包,内层遍历元素(排列)
class Solution {
public:
    int combinationSum4(vector& nums, int target) {
        int n=nums.size();
        vectordp(target+1,0);
        dp[0]=1;
        for(int i=0;i<=target;i++){
            for(int j=0;j=nums[j] && dp[i]<=INT_MAX-dp[i-nums[j]]){
                    dp[i]+=dp[i-nums[j]];
                }
            }
        }
        return dp[target];
    }
};

70.爬楼梯进阶

思路:
  • 1.dp存储:第i阶楼梯,方法有dp[i]种
  • 2.dp[i]+=dp[i-nums[j]]
  • 3.初始化:dp[0]=1
  • 4.遍历顺序:1 2 和 2 1是不同的,所以是排列
class Solution {
public:
    int climbStairs(int n) {
       vectordp(n+1,0);
       dp[0]=1;
       int m=1;
       for(int i=1;i<=n;i++){
           for(int j=1;j<=m;j++){
               if(i>=j){
                   dp[i]+=dp[i-j];
               }
           }
       }
       return dp[n];
    }
};

322.零钱兑换 

思路:
  • 1.dp存储:金额为j时,所用的最少硬币数dp[j]
  • 2.dp[j]=min(dp[j],dp[j-coins[i]]+1)
  • 3.初始化:dp[0]=1
  • 4.遍历顺序:组合,外层遍历硬币,内层遍历金额
class Solution {
public:
    int coinChange(vector& coins, int amount) {
        vectordp(amount+1,INT_MAX);
        dp[0]=0;
        for(int i=0;i

你可能感兴趣的:(#,代码随想录算法训练营(19),算法,动态规划)