如何检查一个整数是不是是给定整数的和?

Posted

技术标签:

【中文标题】如何检查一个整数是不是是给定整数的和?【英文标题】:How to check if a integer is sum of given integers?如何检查一个整数是否是给定整数的和? 【发布时间】:2010-05-26 12:28:43 【问题描述】:

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

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

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

谢谢!

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

【问题讨论】:

一个好问题,但澄清了首选结果是什么。假设 a,b,c 是持续时间,而 i,j,k 是每个持续时间的数量,您是更喜欢持续时间的最少数量(i+j+k 最小)还是较长持续时间的数量更少(优先级较低a,b,c) 的值? ***.com/questions/1467907(复杂但相当理想) 我只想知道组合是否存在! 您的持续时间是固定的吗?一些参数组合可以用“贪婪”算法轻松解决,还有一些 - 幂 - 甚至比这更简单。 【参考方案1】:

这是Frobenius Problem,通常是 NP-Hard。

不过,对于小型实例,相当快的算法是已知的。

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

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

还知道任何大于(a-1)(b-1)的数都可以表示为ai + bj的形式,其中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

【讨论】:

【参考方案2】:

您的问题陈述太模糊,无法确定 - 如果输入向量不是固定长度,i、j、k...的可能值是多少?

在我看来,您的问题似乎是 knapsack problem. 的变体

【讨论】:

以上是关于如何检查一个整数是不是是给定整数的和?的主要内容,如果未能解决你的问题,请参考以下文章

检查输入到文本字段的值是不是是给定范围内的整数

如何检查一个整数是不是在 PHP 中的数字范围内?

[算法学习]给定一个整型数组,找出两个整数为指定整数的和

给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。

如何检查整数是否在给定范围的集合中? [关闭]

给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。