Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 用N个硬币求和K_Algorithm - Fatal编程技术网

Algorithm 用N个硬币求和K

Algorithm 用N个硬币求和K,algorithm,Algorithm,给定N种A[1]面额的硬币,A[2]…A[N],其中每个A[i]都是唯一的,并且它们是每种面额的无限硬币。而且它们最多可以是15种硬币,这意味着N让C[K]成为总K的方法数。我们有一个线性齐次递推 C[K] | K < 0 = 0 | K == 0 = 1 | K > 0 = sum from j=1 to N of C[K - A[j]]. 例如,对于A=[1,3,4],该矩阵L为 [1 0 1 1] [1 0 0 0] [0 1 0 0] [0 0 1

给定N种A[1]面额的硬币,A[2]…A[N],其中每个A[i]都是唯一的,并且它们是每种面额的无限硬币。而且它们最多可以是15种硬币,这意味着N让
C[K]
成为总
K
的方法数。我们有一个线性齐次递推

C[K] | K <  0 = 0
     | K == 0 = 1
     | K >  0 = sum from j=1 to N of C[K - A[j]].
例如,对于
A=[1,3,4]
,该矩阵
L

[1 0 1 1]
[1 0 0 0]
[0 1 0 0]
[0 0 1 0].
第一行的
A[j]
列为
j=1
N
(或者,如果存在具有相同价值的可分辨硬币,则数字更高)。其他行在主对角线的正下方有一行

[1 0 1 1] [C[3]] = [C[3]        + C[1] + C[0]] = [C[4]]
[1 0 0 0] [C[2]]   [C[3]                     ]   [C[3]]
[0 1 0 0] [C[1]]   [       C[2]              ]   [C[2]]
[0 0 1 0] [C[0]]   [              C[1]       ]   [C[1]]

要在序列中快速向前跳到
K
,请使用计算
L^K
,然后乘以初始条件向量
[C[0]…C[-M+1]'=[1 0…0]'
,并返回第一个条目(即矩阵幂的左上条目)。

假设
K
10^18
A=[1,2]
。仅计算类型为
[1,1,…2],[1,1,…2,1]
的答案,您将得到
10^18-1
这样的数组,您必须返回。因此,我的结论是,根据您提出的约束条件,由于时间和空间的复杂性,这个问题是计算机无法解决的。

对于这样的问题,请您解释一个测试用例。我不明白。您是如何制作矩阵的?这个初始条件向量是什么?对于a=[1,3,4],这个矩阵L是[1 0 1][1 0 0 0 0][0 1 0 0][0 0 1 0]?你能解释一下你的复发吗?@user3840069稍微扩展了我的答案。为什么[C[3]=[C[3]+C[1]+C[0]=[C[4]]?我是说你在为[1,3,4]做什么?
[1 0 1 1] [C[3]] = [C[3]        + C[1] + C[0]] = [C[4]]
[1 0 0 0] [C[2]]   [C[3]                     ]   [C[3]]
[0 1 0 0] [C[1]]   [       C[2]              ]   [C[2]]
[0 0 1 0] [C[0]]   [              C[1]       ]   [C[1]]