子集总和问题[嵌套循环解决方案?]

时间:2019-04-08 14:52:29

标签: arrays algorithm dynamic-programming subset-sum

我正在努力解决Subset-Sum问题。问题陈述是-

给出一组非负整数和一个值总和,确定给定集合的子集是否等于总和。

示例: Input: set[] = {3, 34, 4, 12, 5, 2}, sum = 9 Output: True //There is a subset (4, 5) with sum 9.

我看到了解决此问题的不同方法。其中一种使用递归,另一种使用动态编程。

我的问题是,为什么我们不能使用嵌套循环来解决问题。 他们每个人都在考虑一个元素,并逐一检查它是否构成一个完整的总和?

对不起,我是算法和新手。

1 个答案:

答案 0 :(得分:2)

实际上有可能使用(很多)嵌套循环来解决子集和问题。那可能会被称为“非递归暴力天真方法”之类的东西。
您可能永远不会看到它,因为这是解决问题的非常非常笨拙的方法。
实际上,您将需要与输入集中的元素数量一样多的嵌套循环,这意味着针对每种情况编写不同的程序(起始集中的1个元素,起始集中的2个元素,等等...)。
或者最终,编写一个以设置大小N作为输入的程序,并编写一个带有N嵌套循环的程序。但是无论如何,其结果将是“良好的编码习惯”。

递归方法确实做到了这一点(严格等于许多嵌套循环,每个递归调用都会在“新”循环中向您发送信号),但更简单,更优雅(尽管对a的子集进行了完整的枚举)集,这是非常非常昂贵的)。较简单的代码更易于检查,更易于编辑,更易于测试,更容易调试...(以及不断出现…………良好实践常常是有原因的。)