【问题标题】:Algorithm to find set of numbers of a given array with a condition找到具有条件的给定数组的一组数字的算法
【发布时间】:2011-11-22 05:54:04
【问题描述】:

用户给定一个大小为 N 的整数数组。 打印所有可能的集合,使所有可能的数字之和等于数组中的一个数字。

例子:

数组 A[]= {1,2,3,4,5}

1+2=3..输出:1,2,3

1+3=4..输出:1,3,4

1+4=5..输出:1,4,5

初始设计:

  1. 取一个数字并将其设置为 SetSum
  2. 生成除所选数字之外的所有总和;检查公式总和是否与 SetSum 相同
  3. 打印出满足上述条件的数字。
  4. 遍历数组并将下一个数字设置为 SetSum

欢迎采用更高效的设计/实施或不同的方法..

【问题讨论】:

  • 如果他们问你这个问题,那么不要为他们工作。
  • 集合的排列是该集合以某种特定顺序的排列。 (1,2) 和 (2,1) 是 {1,2} 的排列。很难说你被要求找到什么,但这些绝对不是排列。
  • 是的..我接受..我有兴趣只找到满足给定条件的一组数字..
  • 我认为这个问题类似于Subset sum problem,是NP-complete。而且你的方法没问题。此外,您可以对数组进行排序,并在 SetSum 数字前面传递数字。这将减少对函数的一些无用调用。

标签: java c algorithm


【解决方案1】:

这个问题需要你找到总和为给定数字(这里是集合的元素)的子集。这样做有两种方法:

  1. 一种蛮力算法,您可以手动生成所有子集并将它们全部相加,按指数增长顺序(2^n 组合)或

  2. 对问题使用动态规划方法并在多项式时间内求和。这是算法中的一个标准问题,称为子集和问题。如果您不熟悉动态规划的概念,可以查阅任何算法教科书。如果你了解动态规划,那么谷歌搜索子集和问题。希望对您有所帮助!

【讨论】:

  • 据我了解,子集总和问题有一个目标 K,您可以打印出总和为 K 的所有数字。但是在这里您有多个目标..
  • 使用“或”子句。不是检查总和是否达到特定整数,而是检查总和是否达到 (S1|S2| ... | Sn),其中 S1 到 Sn 是您的集合的元素。另一种方法是为集合中的每个元素运行算法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 2017-03-27
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 2019-10-09
相关资源
最近更新 更多