用于确定可能组合的数量的算法

时间:2012-06-13 09:03:56

标签: algorithm permutation

我需要为给定的问题编写一个算法:你有无限的硬币,镍币,硬币和四分之一。写一个类方法,输出所有硬币组合,总计为99美分。

这似乎是一个排列nPr问题。任何algoritham吗?

此致 Priyank

4 个答案:

答案 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是一个有序的面额数组