LeetCode322零钱兑换

零钱兑换
在这里插入图片描述

dp[i]i元至少需要多少个硬币个数,则其前一个状态位使用现有硬币的情况下至少需要多少硬币 dp[i-coins[j]],dp[i]=min(dp[i-coins[j]+1

package BDyNamicProgramming;

import AarrayProblem.Problem1;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/4/21 0021  18:47
 * 零钱兑换
 * 给定不同面额的硬币 coins 和一个总金额 amount。
 * 编写一个函数来计算可以凑成总金额所需的最少的硬币个数。
 * 如果没有任何一种硬币组合能组成总金额,返回 -1。
 */
public class Problem322 {

    /**
     * dp[n]为凑成n源所需要的最少硬币个数
     * dp[n] =   Math.min(dp[n-i])+1 i为所有的比值
     * dp[0]= 0  dp[1]
     * @param coins
     * @param amount
     * @return
     */
    public int coinChange(int[] coins, int amount) {



        int[] dp = new int[amount+1];
        //凑成0元需要0个硬币
        dp[0]=0;

        for(int i=1;i<=amount;i++){
            //最少的个数
            int min = Integer.MAX_VALUE;
            //从硬币中挑选(挑选某个硬币之后
            for(int j=0;j<coins.length;j++){

                //假如硬币的值与需要凑的前相等则直接为1
                if(coins[j]==i) {
                    min=1;
                    break;
                }

                //凑成i元的最小值 为  从i-coins[j]
                if(i-coins[j]>=0&&dp[i-coins[j]]!=-1) //可以凑的话
                min = Math.min(min,dp[i-coins[j]]+1);

            }
            //凑不出来的话
            if(min==Integer.MAX_VALUE){
                dp[i]=-1;
            }else {
                //最少的个数
                dp[i] = min;
            }
        }
        return dp[amount];
    }


    public static void main(String[] args) {

        int[] coins = {2};
        Problem322 problem322 = new Problem322();
        int size =problem322.coinChange(coins,3);
        System.out.println(size);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值