【发布时间】:2019-01-10 04:09:26
【问题描述】:
问题:给你不同面额的硬币和总金额。编写一个函数来计算组成该数量所需的最少硬币数量。如果该金额不能由任何硬币组合弥补,则返回-1。
示例 1:
输入:硬币 = [1, 2, 5],金额 = 11 输出:3 解释:11 = 5 + 5 + 1
示例 2:
输入:硬币 = 2,金额 = 3 输出:-1
You may assume that you have an infinite number of each kind of coin.
我的代码:
public int coinChange(int[] coins, int amount) {
Arrays.sort(coins);
int new_amount=amount;
int count_coin=0;
int q=0,r=0,a=0;
int k=coins.length-1;
while(amount>0 && k>=0) {
q = new_amount / coins[k];
count_coin = count_coin + q;
r = new_amount % coins[k];
new_amount=r;
a+=q*coins[k];
k--;
}
if(a==amount){
return count_coin;
}
else{
return -1;
} }
我的代码适用于给定的两个示例。在处理完这个例子后,我又做了一个测试用例。
示例 3:输入:硬币 = [186,419,83,408],金额 = 6249 输出:20 我的输出:-1
我无法理解这个例子。如果有人对这个例子或除我之外的任何其他更好的算法有任何想法,请与我分享。
我看到了Coin Change (Dynamic Programming) 链接。但是看不懂。
我也研究了Why does the greedy coin change algorithm not work for some coin sets? ,但看不懂它想表达什么。所以我提出了这个问题。
提前谢谢你。
【问题讨论】:
-
假设您在硬币数组中有 3 和 5。并且数量是6,那么你总是会先选择5,然后数量是1。使用递归函数并尝试回溯
标签: java algorithm while-loop dynamic-programming brute-force