假设我有一个整数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
答案 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.
的变体