【问题标题】:Algorithm for selecting specific number of elements from a set to reach some value从集合中选择特定数量的元素以达到某个值的算法
【发布时间】:2011-05-10 13:11:57
【问题描述】:

给定一组元素 n[1], n[2], n[3], .... n[x] 和一个数字 V。(元素有自己的值)

我想找到满足以下条件的所有元素组合:

1) 每个组合都包含特定数量的元素(例如:正好 5 个元素)

组合#1: n[1]、n[2]、n[21]、n[22]、n[24]

组合#2: n[1]、n[2]、n[12]、n[15]、n[33]

......

2) 组合中的元素值之和必须小于给定数 V(例如 V = 100)

组合#1: n[1] + n[2] + n[21] + n[22] + n[24]

组合#2: n[1] + n[2] + n[12] + n[15] + n[33]

......

我正在尝试编写一个计算这些元素的 c# 程序。但是语言并不重要,任何满足这些条件的算法都是可以接受的!

谢谢

【问题讨论】:

标签: algorithm math random combinations


【解决方案1】:

由于无论如何您都可能不得不使用蛮力,您可以使用以下方法解决您的问题:

首先,对你的输入集 S 进行排序。

然后从 S 中删除所有大于V - 4*|min| 的元素(其中|min| 是最小元素的绝对值),因为它们无论如何都不会出现在您的任何解决方案中。根据您的具体问题规范,此优化可能会进一步改进。

现在您生成 S 中所有元素长度 C 的总和,从可能的最小数字开始(记住 S 已排序)。

如果结果小于 V,请将其添加到您的解决方案集中并增加最后一个和。

否则,将先前增加的被加数和之后的所有被和数设置为它们的最小可能值,并在此之前增加被和数。

如果所有加法都达到了可能的最高值,您可以停止。你也许可以在那之前很久就停下来,由于我的英语草率,这留给读者作为练习。

【讨论】:

  • 感谢您的方法,因为我的英语也很草率,所以最好看一个示例代码:)
【解决方案2】:

我不太确定,但也许您可以调整这个想法,使其具有所有组合必须具有一定数量的元素的条件。

http://en.wikipedia.org/wiki/Knapsack_problem

但是,据说背包问题具有 NP-complete 的复杂性,需要精确解决……这是个坏消息。所以人们建议做的是使用回溯算法。

我相信你会在 google 中找到很多关于背包问题回溯的代码。

希望对你有帮助

【讨论】:

  • 你想数一数还是一一列举?
  • 我正好需要 C(constant) 元素,也许我可以使用回溯,但示例代码可能会有所帮助
  • @Mehmet:我不明白你的回答。你想列出元素,还是计算它们?
  • 我想列出元素,(所有可能的组合)
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 2011-02-23
  • 2013-04-21
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多