编辑:之前我使用过2,5和16。但他们只是例子。但现在我想推广任何3个数字。
我有一个数字可以说N.这个数字只能通过添加x1,x2和x3来形成。我们可以使用三个数字任意数量的时间和任意组合。
这可以通过动态编程解决,还是有其他一些简单的方法?
答案 0 :(得分:3)
如果您只有2个互质值,请使用Chicken McNugget Theorem。否则,请跳至Dynamic programming
解决方案。
将16
删除为冗余(因为它是2的幂,所以只使用更多的两个而不是它),2
和5
是互质的,所以最大的数字无法写为2a + 5b
的是2*5 - 2 - 5 = 3
。任何高于此的内容都可以写出来。
对于2
和5
的特定情况,解决方案的存在也可以这样说:显然偶数只能使用2
来编写。赔率:
2k+1 = (2k - 4) + 5
因此,一旦它们变得足够大,通过使用两个5
,它们总是可以写出来。
有关3个或更多数字,请参阅示例Frobenius Numbers和Numerical 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)
。显然,解决这个问题涉及到一些正常形式的矩阵。