【发布时间】:2016-04-12 01:21:03
【问题描述】:
我试图在一个数组中找到一个值的子集,它加起来为给定的数字并返回该子集的数组。我需要返回数组包含尽可能高的最大值。
整数数组将始终按升序排列,但并不总是有有效的答案。如果没有有效答案,我需要按照“没有有效答案”的行返回一个字符串。
例如:
如果 int 数组是:[1, 2, 3, 5, 7, 9, 11] 并且目标是 19 - 我希望返回数组是 [1, 7, 11]。
我不想返回[9, 7, 3],因为11 大于9,我不想返回[3, 5, 11],因为7 大于5。
我假设我需要一个递归函数中的 for 循环来获得我的答案,但一直无法弄清楚如何去做。
我在 Java 中发现了这个问题的变体: https://codereview.stackexchange.com/questions/36214/find-all-subsets-of-an-int-array-whose-sums-equal-a-given-target
我还在 JavaScript 中找到了一个返回值对的解决方案(尽管这很简单): https://codereview.stackexchange.com/questions/74152/given-an-array-of-integers-return-all-pairs-that-add-up-to-100
我在想你需要从数组的最后一个元素开始循环,然后在数组中向后循环,以检查是否有两个数字的组合,其总和是目标。
如果没有一对,则需要从总和小于目标的最大一对数字开始,然后循环遍历数组以查找是否存在组合。
需要继续执行此操作,直到找到子集或您发现没有有效答案。
请帮忙!
【问题讨论】:
-
家庭作业问题...
-
哦,当然,knapsack problem 的一种解决方案即将出现... ;-P
-
你能提供一个你认为可以完成这项工作的算法的类似英语的描述吗?
-
@torazaburo 我在算法描述中添加了我认为可以在描述底部完成这项工作的算法。谢谢。
-
@deceze 其实这不是背包问题,而是子集和问题。我不是复杂性理论方面的专家,但我的感觉是,他想要找到一个涉及最大值的解决方案的条件大大简化了这个问题,它甚至可能不再是 NP 完全的。
标签: javascript loops recursion