【问题标题】:Create a sum of 1000, 2000, etc. from set of numers从一组数字中创建 1000、2000 等的总和
【发布时间】:2009-12-19 00:07:20
【问题描述】:

好的,问题来了:

我需要从 50-100 个项目集中找到任意数量的中间组,它们的总和为 1000、2000、...、10000。

输入:整数列表

整数只能在一个列表中。

对算法有什么想法吗?

【问题讨论】:

  • 作业题应该这么说吧。

标签: algorithm


【解决方案1】:

在谷歌上搜索“背包问题”应该会得到很多点击(尽管它们不太可能非常令人鼓舞——这是一个众所周知的 NP 完全问题)。

编辑:如果你想获得技术,你所描述的似乎真的是子集和问题——这是背包问题的一个特例。当然,这是假设我正确理解了您的描述,我承认这可能会引发一些问题。

您可能会发现 The Handbook of Applied Cryptography 中的算法 3.94 很有帮助。

【讨论】:

  • 这不是真正的问题 - 在我的情况下,这不是优化 - 不需要获得最大数量的结果。
  • 获得a结果只是获得最佳结果的特例。不幸的是,你仍然处于 NP-complete 领域。
  • 这就是答案,仍然 O(n2^(n/2)) 很伤心,但我能得到最好的。
【解决方案2】:

我不是 100% 了解您的要求,但我以前使用过回溯搜索来搜索类似的内容。这是一种蛮力算法,可能是最慢的解决方案,但它会起作用。 Backtracking Search 上的 wiki 文章可能会对您有所帮助。基本上,您可以使用递归算法来检查每个可能的组合。

【讨论】:

    【解决方案3】:

    这是背包问题。您可以选择的整数是否有任何限制?它们是可分的吗?它们都小于某个给定值吗?考虑到这些限制,可能有一些方法可以在多项式时间内解决问题 - Google 会为您提供答案。

    【讨论】:

    • 背包问题有两个参数——重量和价值。我只有体重。约束是它们在 1 - 10000 范围内,仅此而已。
    • 在算法的上下文中,所有整数的值都可以是 1,它们的值可以等于它们的权重,或者其他一些变体 - 这只是转换你的问题以适应算法的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多