动态规划学习:零钱兑换

一、零钱兑换问题I

  • 给定一组面额硬币,每组硬币可能有多个,给定一个总金额amount,求组成总金额所需的最少硬币数,若组不成返回-1

代码实现

package OneDaySuanFa;

import DataStructure.Array.Array;

import java.util.Arrays;

public class HuanChange {
    public static int huanchange(int[] coins,int amount){
        int n = coins.length;
        int[] dp = new int[amount+1];
        //dp[i]表示组成总金额i的最少硬币数
        Arrays.fill(dp,Integer.MAX_VALUE);
        dp[0] = 0;

        for (int i = 0; i < n; i++){
            for (int j = coins[i]; j <= amount; j++){
                if (dp[j-coins[i]] != Integer.MAX_VALUE){
                	//可以选择放或者不放
                    dp[j] = Math.min(dp[j-coins[i]] + 1,dp[j]);
                }
            }
        }

        if (dp[amount] == Integer.MAX_VALUE) return -1;
        return dp[amount];
    }

    public static void main(String[] args) {
        int[] coins = new int[]{1,2,5};
        System.out.println(huanchange(coins,20));
    }
}

二、零钱兑换问题II

  • 给定一组面额硬币,每个硬币可能有多个,给定一个总金额amount,求组成amount一共有多少种组合,若组不成返回-1

代码实现

package OneDaySuanFa;

public class HuanChange2 {
    public static int huanchange2(int[] coins,int amount){
        int n = coins.length;
        int[] dp = new int[amount + 1];
        //dp[i]表示凑成总金额i有多少种方法
        dp[0] = 1; //凑成总金额0只有一种方法,即什么都不放

        for (int i = 0; i < n; i++){
            for (int j = coins[i]; j <= amount; j++){
                //可以选择不放或者放入
                //这里不放是因为硬币有多个,不放可能是已经放了一个的状态
                dp[j] = dp[j] + dp[j-coins[i]];
            }
        }

        return dp[amount];
    }

    public static void main(String[] args) {
        int[] coins = new int[]{1,2,5};
        int amount = 11;
        System.out.println(huanchange2(coins,amount));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱夜来香A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值