/** * 给出k中面值的硬币,每种硬币的数量无限,再给一个总金额amount,问最少需要几枚硬币凑出这个金额,如果凑不出,返回-1 * dp[i]定义:当目标金额为i时,至少需要dp[i]枚硬币凑出 */
public class Coin {
public static void main(String[] args) {
int[] coins = new int[] { 1,3,5};
int amount = 11;
int res = calc(coins, amount);
System.out.println(res);
}
static int calc(int[] coins, int amount) {
int[] dp = new int[amount + 1];
Arrays.fill(dp, amount + 1);
dp[0] = 0;
for (int i = 0; i < dp.length; i++) {
for (int coin: coins) {
if (i - coin < 0) continue;
//状态转移方程,
//比较凑齐当前金额i需要的硬币和凑齐减去一个coin的金额i-coin所需要的硬币+1块硬币的数量,谁更小
dp[i] = Math.min(dp[i], 1 + dp[i - coin]);
}
}
return dp[amount];
}
}
还没有评论,来说两句吧...