【Hot100】LeetCode—322. 零钱兑换

打印 上一主题 下一主题

主题 1594|帖子 1594|积分 4782




  • 原题链接:322. 零钱兑换

1- 思路

动态规划

动规五部曲


  • 1- 定义 dp 数组确定含义

    • dp[j] 代表凑到款项为 j 的最少硬币个数

  • 2- 递推公式

    • dp[j] = Math.min(dp[j],dp[amount-]+1)

  • 3- 初始化

    • dp[0] = 0
    • 其他全部初始化为 max

  • 4- 遍历序次

    • 先遍历物品,再遍历背包
    • 递推过程需要判断 dp[j - coins] != max


2- 实现

322. 零钱兑换——题解思路


  1. class Solution {
  2.     public int coinChange(int[] coins, int amount) {
  3.         // 1. 定义 dp 数组
  4.         // dp[j] 代表凑到金钱为 j 的最少硬币个数
  5.         int[] dp = new int[amount+1];
  6.         // 2.递推公式
  7.         // dp[j] = Math.min(dp[j],dp[amount-]+1)
  8.         
  9.         // 初始化
  10.         dp[0] = 0;
  11.         int max = Integer.MAX_VALUE;
  12.         for(int i = 1 ; i <= amount;i++){
  13.             dp[i] = max;
  14.         }
  15.         // 4. 遍历顺序
  16.         // 物品
  17.         
  18.         for(int i = 0 ; i < coins.length;i++){
  19.             for(int j = coins[i] ; j <= amount ; j++){
  20.                 if(dp[j - coins[i]] != max){
  21.                     dp[j] = Math.min(dp[j],dp[j-coins[i]]+1);
  22.                 }
  23.             }
  24.         }
  25.         if(dp[amount]==max){
  26.             return -1;
  27.         }
  28.         return dp[amount];
  29.     }
  30. }
复制代码

3- ACM 实现

  1. public class minCoins {
  2.     public static int minCoins(int[] nums,int target){
  3.         // 定义 dp
  4.         int[] dp = new int[target+1];
  5.         // 2. 递推公式
  6.         // dp[j] = Math.min(dp[j],dp[j-coins[i]]+1);
  7.         // 3.初始化
  8.         dp[0] = 0;
  9.         int max = Integer.MAX_VALUE;
  10.         for(int i = 1 ; i <= target;i++){
  11.             dp[i] = max;
  12.         }
  13.         // 4.遍历顺序
  14.         for(int i = 0 ; i <nums.length;i++){
  15.             for(int j = nums[i]; j<=target;j++){
  16.                 if(dp[j-nums[i]] != max){
  17.                     dp[j] = Math.min(dp[j],dp[j-nums[i]]+1);
  18.                 }
  19.             }
  20.         }
  21.         if(dp[target]==max){
  22.             return -1;
  23.         }
  24.         return dp[target];
  25.     }
  26.     public static void main(String[] args) {
  27.         Scanner sc = new Scanner(System.in);
  28.         String input = sc.nextLine();
  29.         String[] parts = input.split(" ");
  30.         int[] nums = new int[parts.length];
  31.         for(int i = 0 ; i < parts.length;i++){
  32.             nums[i] = Integer.parseInt(parts[i]);
  33.         }
  34.         int target = sc.nextInt();
  35.         System.out.println("结果是"+minCoins(nums,target));
  36.     }
  37. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表