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);
}
}