【发布时间】:2016-10-31 18:54:28
【问题描述】:
使用递归,编写一个给定整数列表和给定总和的程序, 将找到总数为给定总和的数字的所有子集。计算找到的子集数。如果不存在子集,则应指出未找到解决方案。例如,给定列表 6、13、3、3,总和为 19,您的程序应该找到两个 解决方案:
6 + 13 = 19
13 + 3 + 3 = 19
将输入列表中的整数个数限制为最多 20 个整数。接受 仅正整数并使用 0 来标记列表的结尾。 以下是运行示例:
Enter positive integers terminated with 0: 6 13 3 3 0
Enter the desired sum: 19
Solution 1:6 +13 =19
Solution 2: 13 +3 +3 =19
Found 2 solutions
这是我的代码,但它只找到一个子集,我想找到所有子集。有什么帮助吗?
public static boolean SubSetSum(int start, int[] nums, int target) {
if (start >= nums.length) {
return (target == 0);
}
if (SubSetSum(start + 1, nums, target - nums[start])) {
System.out.println( nums[start] );
return true;
}
if (SubSetSum(start + 1, nums, target)) {
return true;
}
return false;
}
public static void main(String[] args) {
int[] mySet = {4,1,3,2};
int sum = 5;
System.out.println("The Goal is : " + sum);
SubSetSum(0,mySet, sum) ;
}
}
【问题讨论】:
-
作为调试提示,不要直接在 if 条件中调用方法,而是创建一个布尔值,它是
SubSetSum()调用的结果。 -
好吧,看看你的代码。如果
target==0在 any 点,那么您已经达到目标,但您没有相应的代码。您仅在start位于数组末尾时检查target==0是否。所以乍一看,这是最明显的问题。另一个调试提示是在函数的第一行打印出函数参数,这样你就可以跟踪所有的调用。 -
@ItamarGreen SO 的问题指南(您知道,您通常在 cmets 中抱怨的那些)是:准确的问题描述、所做的努力、可编译的示例、实际和预期的输出。似乎它符合我的所有标准。
-
@ItamarGreen 不管硬件与否。这个问题很好。请重新考虑。
-
@NikolasCharalambidis,你说得对。我误解了这个问题,但重读后,我发现我错了