当前位置:   article > 正文

代码随想录算法训练营day37|动态规划part05

代码随想录算法训练营day37|动态规划part05

完全背包问题

第一题:518. Coin Change II

  1. class Solution {
  2. public int change(int amount, int[] coins) {
  3. //递推表达式
  4. int[] dp = new int[amount + 1];
  5. //初始化dp数组,表示金额为0时只有一种情况,也就是什么都不装
  6. dp[0] = 1;
  7. for (int i = 0; i < coins.length; i++) {
  8. for (int j = coins[i]; j <= amount; j++) {
  9. dp[j] += dp[j - coins[i]];
  10. }
  11. }
  12. return dp[amount];
  13. }
  14. }
  1. // 二维dp数组版本,方便理解
  2. class Solution {
  3. public int change(int amount, int[] coins) {
  4. int[][] dp = new int[coins.length][amount+1];
  5. // 初始化边界值
  6. for(int i = 0; i < coins.length; i++){
  7. // 第一列的初始值为1
  8. dp[i][0] = 1;
  9. }
  10. for(int j = coins[0]; j <= amount; j++){
  11. // 初始化第一行
  12. dp[0][j] += dp[0][j-coins[0]];
  13. }
  14. for(int i = 1; i < coins.length; i++){
  15. for(int j = 1; j <= amount; j++){
  16. if(j < coins[i]) dp[i][j] = dp[i-1][j];
  17. else dp[i][j] = dp[i][j-coins[i]] + dp[i-1][j];
  18. }
  19. }
  20. return dp[coins.length-1][amount];
  21. }
  22. }

第二题:377. Combination Sum IV

  1. class Solution {
  2. public int combinationSum4(int[] nums, int target) {
  3. int[] dp = new int[target + 1];
  4. dp[0] = 1;
  5. for (int i = 0; i <= target; i++) {
  6. for (int j = 0; j < nums.length; j++) {
  7. if (i >= nums[j]) {
  8. dp[i] += dp[i - nums[j]];
  9. }
  10. }
  11. }
  12. return dp[target];
  13. }
  14. }

第三题:爬楼梯进阶

感觉今天学的技巧性都挺强的,完全背包的还得再看看;

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

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

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/956855
推荐阅读
相关标签
  

闽ICP备14008679号