我已经给出了一个阵列,我必须找到目标总和 例如:
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}
是两种不同的解决方案。
答案 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