使用较小给定数量的组合形成给定数字x

时间:2015-02-19 20:07:26

标签: algorithm

编辑:之前我使用过2,5和16。但他们只是例子。但现在我想推广任何3个数字。

我有一个数字可以说N.这个数字只能通过添加x1,x2和x3来形成。我们可以使用三个数字任意数量的时间和任意组合。

这可以通过动态编程解决,还是有其他一些简单的方法?

2 个答案:

答案 0 :(得分:3)

如果您只有2个互质值,请使用Chicken McNugget Theorem。否则,请跳至Dynamic programming解决方案。

16删除为冗余(因为它是2的幂,所以只使用更多的两个而不是它),25是互质的,所以最大的数字无法写为2a + 5b的是2*5 - 2 - 5 = 3。任何高于此的内容都可以写出来。

对于25的特定情况,解决方案的存在也可以这样说:显然偶数只能使用2来编写。赔率:

2k+1 = (2k - 4) + 5

因此,一旦它们变得足够大,通过使用两个5,它们总是可以写出来。

有关3个或更多数字,请参阅示例Frobenius NumbersNumerical semigroups

动态编程

或者如果你想坚持经典,动态编程:

dp[i] = true if we can reach sum i
dp[0] = true, false for the rest
for i = 0 to query_sum:
  dp[i] = dp[i] or dp[i - input1] or dp[i - input2] or dp[i - input3]

答案 1 :(得分:1)

您正在尝试解决linear diophantine equation,基本上检查线性系统是否具有整数解。你的线性系统将是

a*2 + b*5 + c*16 = N

你正在寻找(a,b,c)。显然,解决这个问题涉及到一些正常形式的矩阵。