我需要为给定的问题编写一个算法:你有无限的硬币,镍币,硬币和四分之一。写一个类方法,输出所有硬币组合,总计为99美分。
这似乎是一个排列nPr问题。任何algoritham吗?
此致 Priyank
答案 0 :(得分:1)
我认为这个问题最容易使用递归表来解答
{5000,2000,... 1} // 50美元到一分钱
你可以从:
开始WaysToMakeChange(10000, 0) // ie. $100...highest denomination index is 0 ($50)
WaysToMakeChange(amount, maxdenomindex) would calculate using 0 or more of the maxdenom
the recurance is something like
WaysToMakeChange(amount - usedbymaxdenom, maxdenomindex - 1)
我对此进行了编程,可以通过多种方式对其进行优化:
1)多线程
2)缓存。这是非常重要的。算法运行方式的B / c,WaysToMakeChange(m,n)将使用相同的初始值多次调用: 例如。改变100美元可以通过以下方式完成: 1 $ 50 + 0 $ 20 + 0 $ 10's + 50美元以上最高货币5美元(即WaysToMakeChange(5000,指数为5美元)) 0 $ 50 + 2 $ 20 + 1 $ 10's + 50美元以上最高货币5美元(即WaysToMakeChange(5000,指数为5美元)) 显然,可以缓存WaysToMakeChange(5000,索引为5美元),以便不需要进行后续调用
3)使最低递归短路。 假设static const int denom [] = {5000,2000,1000,500,200,100,50,25,10,5,1};
WaysToMakeChange(int total,int coinIndex)的第一个测试应该是这样的: if(coins [_countof(coins)-1] == 1&& coinIndex == _countof(coins) - 2){ 返还总金额/硬币[_countof(币)-2] + 1; }
这是什么意思?好吧,如果你的最低面额是1,那么你只需要达到第二低的牛仔(比如镍)。然后剩下1+总/秒最低面额。例如: 49c - > 5个镍币+4个便士。 4个镍币+ 9个便士.... 49便士= 1 +总/秒最低离开
答案 1 :(得分:0)
这个问题似乎是diophantine equation,即对于* x + b * y + ... = n,找到一个解决方案,其中所有字母都是整数。最简单但不是最优雅的解决方案是迭代的(在python中显示,请注意我跳过变量l,因为它类似于数字1):
dioph_combinations = list()
for i in range(0, 99, 25):
for j in range(0, 99-i, 10):
for k in range(0, 99-i-j, 5):
for m in range(0, 99-i-j-k, 1):
if i + j + k + m == 99:
dioph_combinations.append( (i/25, j/10, k/5, m) )
结果列表dioph_combinations将包含可能的组合。
答案 2 :(得分:0)
最简单的方法可能是花一些时间思考问题。有一个相对不错的递归算法,可以很好地用于记忆或重新编写动态编程解决方案。
答案 3 :(得分:0)
这个问题是经典的动态编程问题。你可以在这里阅读它
http://www.algorithmist.com/index.php/Coin_Change
python代码是:
def count( n, m ):
if n == 0:
return 1
if n < 0:
return 0
if m <= 0 and n >= 1:
return 0
return count( n, m - 1 ) + count( n - S[m], m )
这里S [m]给出面额的值,S是一个有序的面额数组