【发布时间】:2015-03-10 09:02:29
【问题描述】:
我被硬币面额的问题困住了。
我试图找出构成 5.70 美元(或 570 美分)的最少硬币数量。例如,如果硬币数组是 {100,5,2,5,1}(100 x 10c 硬币、5 x 20c、2 x 50c、5 x $1 和 1 x $2 硬币),那么结果应该是 { 0,1,1,3,1} 目前硬币阵列将包含相同面额($2、$1、50c、20c、10c)
public static int[] makeChange(int change, int[] coins) {
// while you have coins of that denomination left and the total
// remaining amount exceeds that denomination, take a coin of that
// denomination (i.e add it to your result array, subtract it from the
// number of available coins, and update the total remainder). –
for(int i= 0; i< coins.length; i++){
while (coins[i] > 0) {
if (coins[i] > 0 & change - 200 >= 0) {
coins[4] = coins[4]--;
change = change - 200;
} else
if (coins[i] > 0 & change - 100 >= 0) {
coins[3] = coins[3]--;
change = change - 100;
} else
if (coins[i] > 0 & change - 50 >= 0) {
coins[2] = coins[2]--;
change = change - 50;
} else
if (coins[i] > 0 & change - 20 >= 0) {
coins[1] = coins[1]--;
change = change - 20;
} else
if (coins[i] > 0 & change - 10 >= 0) {
coins[0] = coins[0]--;
change = change - 10;
}
}
}
return coins;
}
我被困在如何从硬币数组中扣除值并返回它。
编辑:新代码
【问题讨论】:
-
这是一个(未优化的)算法:对于每个面额,当您剩余该面额的硬币并且总剩余金额超过该面额时,取出该面额的硬币(即将它添加到您的结果数组中,从可用硬币的数量中减去它,然后更新总余数)。
-
你的方向不对,你有一个NP-Complete问题,并且没有已知的多项式解决方案。但是,对于每个硬币都有无穷大的情况,有一个伪多项式解,这被称为Change Making Problem。我不知道你是否可以调整每个硬币数量有限的伪多项式解。
-
请检查我的编辑家伙
-
@user3353723 你一直在说“有人发布一些代码”。您想了解如何解决问题吗?
-
如果不同种类的硬币数量有限,我认为贪婪是行不通的,即使面额是规范。让我换个说法:如果对每种硬币的数量施加限制,我不认为所有规范面额都可以通过贪婪来最佳解决。它可能适用于一组 OPs 面额,以及 canonical 面额的子集。