Algorithm 用N个硬币求和K
给定N种A[1]面额的硬币,A[2]…A[N],其中每个A[i]都是唯一的,并且它们是每种面额的无限硬币。而且它们最多可以是15种硬币,这意味着N让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
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]]