查找所有组合以将一组硬币加到一定数量

时间:2014-09-17 16:15:18

标签: algorithm

我已经给出了一个阵列,我必须找到目标总和 例如:

A[] ={1,2,3};
 S = 5;

总组合= {1,1,1,1,1},{2,3},{3,2}。 {1,1,3},{1,3,1},{3,1,1}和其他可能的对

我知道这听起来像coin change problem但是问题是如何找到组合,即{2,3} and {3,2}是两种不同的解决方案。

1 个答案:

答案 0 :(得分:2)

在原始硬币更改问题中,您选择"任意硬币 - "猜测"如果是或者不在解决方案中,这样做是因为订单并不重要。

在这里,你将不得不迭代所有可能性"哪个硬币是第一个",直到你完成:

D(0) = 1
D(x) = 0 | x < 0
D(x) = sum { D(x-coins[0]) , D(x-coins[1]), ..., D(x-coins[n-1] }

请注意,对于每个步骤,您都可以选择下一个硬币并继续前进。最后,您总结了所有解决方案,以便将每个硬币放在解决方案的首位。

使用DP的此解决方案的复杂性为O(n*S),其中n为硬币数量,S为所需金额。

Matlab代码(以命令式方式编写,这是我目前的开放式IDE,对不起它的matlab而不是像Java或C这样的常用语言)

function [ n ] = make_change( coins, x )
    D = zeros(x,1);
    for k = 1:x
        for t = 1:length(coins)
            curr = k-coins(t);
            if curr>0
                D(k) = D(k) + D(curr);
            elseif curr == 0
                D(k) = D(k) + 1;
            end
        end
    end
    n = D(x);
end

调用将产生:

>> make_change([1,2,3],5)

ans =

    13

这是正确的,因为所有可能性都是[1,1,1,1,1],[1,1,1,2] * 4,[1,1,3] * 3,[1,2, 2] * 3,[2,3] * 2 = 13