如何检查整数是否是给定整数的总和?

时间:2010-05-26 12:28:44

标签: c# algorithm integer-division

假设我有一个整数result和一个整数数组,让我们说[a,b,c](不是固定长度)。我需要使用result=a*i +b*j + c*k检测i,j,k>=0是否为{{1}}。

如果有可能,我更喜欢C / C#中的解决方案。

PS问题来自预订系统,如果旅程的持续时间是给定持续时间的组合,则可以出售旅程。

谢谢!

例如:如果我们有a = 3,则b = 7   比rezult 20 = 3 * 2 + 7 * 2         结果9 = 3 * 3 + 7 * 0

2 个答案:

答案 0 :(得分:6)

这是Frobenius Problem,一般是NP-Hard。

对于小型实例,已知合理快速的算法。

这里的论文:http://www.combinatorics.org/Volume_12/PDF/v12i1r27.pdf似乎描述了以前的算法(其中包括Dijkstra最短路径算法的应用!)加上它提供了一种新算法,它显然比以前的算法更快。

在任何情况下,对于只有2个数字的情况,a和b使得gcd(a,b)= 1,找到i,j> = 0使得a i + b j = M很容易解决。

众所周知,任何大于(a-1)(b-1)的数字都可以 i + b j的形式表示,其中i > = 0且j> = 0.Frobenius数被定义为不能以该形式表示的最大数,并且当n> = 2且gcd(a,b,c ...)= 1时存在

所以在你的情况下,如果涉及的数字足够小,你可以对数组进行排序,找到'最小'的两个a和b,使得gcd(a,b)= 1并看看M>(a- 1)(b-1),只需使用a和b即可解决。

如果M <=(a-1)(b-1),并且a和b足够小,你可能只能强行推出它。

答案 1 :(得分:0)

您的问题陈述过于模糊,无法确定 - 如果输入向量不是固定长度,i,j,k的可能值是什么?

听起来好像你的问题是knapsack problem.

的变体