C# 有没有一个已知的算法来找出N个元素中的K个元素的和最接近整数?

C# 有没有一个已知的算法来找出N个元素中的K个元素的和最接近整数?,c#,.net,algorithm,math,time-complexity,C#,.net,Algorithm,Math,Time Complexity,举个小例子,假设我有N=6个元素 { 0.03, 0.25000039, 1.391, 500.1, 0.5000001, 1.75001 } 和K=3那么组合{0.25000039,0.5000001,0.2500001},总计为1.00000059将是最接近整数的组合 不使用“暴力”(迭代所有n选择k元素)是否可以解决此问题?我可以想到: 有一个目标。最初的目标是您想要到达的号码 选择小于或等于目标的最大数字 如果在上一步中有这样一个数字,则将目标值减少该数字 如果目标为零,则完成,否

举个小例子,假设我有
N=6个
元素

{ 0.03, 0.25000039, 1.391, 500.1, 0.5000001, 1.75001  } 
K=3
那么组合
{0.25000039,0.5000001,0.2500001}
,总计为
1.00000059
将是最接近整数的组合

不使用“暴力”(迭代所有
n选择k
元素)是否可以解决此问题?

我可以想到:

  • 有一个目标。最初的目标是您想要到达的号码
  • 选择小于或等于目标的最大数字
  • 如果在上一步中有这样一个数字,则将目标值减少该数字
  • 如果目标为零,则完成,否则转到2
  • 否则,请选择序列中的最小数字
  • 将目标减少该数字,并检查目标的绝对值现在是否大于上一个目标,如果是,则取最后一个数字,如果不是,则保留该数字,并且在最后一个数字之前的当前序列就是答案
  • 到目前为止,它给出了一个非常接近的答案。为了达到100%的效果,你这次重复同样的过程,没有最大的数字。此外,我在算法中省略了这一点,即当你想选择一个新的数字时,如果没有剩下的数字,你就完成了,这是你能得到的最接近的结果。我之所以忽略这一点,是因为您可能希望允许一个数字出现多次,因此不需要此部分


    这是我想到的。它可能需要一些测试,如果您认为它是错误的,请在评论中告诉我。:)

    我想这个任务可以简化为经典任务。因此,我们所知道的解决方案是NP完全的。

    我认为你的两个问题的答案是“是”和“否”。有一种已知的算法——“暴力”。这就是为什么第二个答案是否定的。这是一个变体,是NP完全的;因此它没有有效的解决方案。尝试将和限制为多项式f(n)。它可能会有帮助…它看起来确实很相似,但你能展示一下如何减少它吗?对我来说,乍一看,降幅并不明显。我们这里讨论的是优化问题,而不是决策问题,所以相关的背包问题不是NP完全问题,而是NP难问题。虽然没有多大帮助…我不是数学家,所以可能是错的)对我来说,这似乎是一个“无限”的背包集,大小为1,2,3。。。我们还有一套元素,我们想放进其中一个背包里。考虑到该任务允许我们找到一个稍微超过背包大小的组合,我们可以假设我们也有一些大小的“虚拟”元素。事实上,我们已经预先定义了我们必须使用的元素数量(K),简化了解决方案,但我仍然认为,如果不经过所有可能的组合,就无法找到最佳匹配,哪些是O(N!)。如果近似解足够好的话,我建议寻找某种遗传算法(),对于近似解,背包问题有很多算法,可能在这种情况下可以修改。但我仍然想知道固定K是如何影响复杂性的。在固定K的情况下,我们使用N中的许多K-组合。对于任意数量的元素,我们必须处理N中的K-组合的总和,从1到N,这显然更大,因为它也包括K-组合。无论如何,这几乎无助于解决最初的问题。