我试图为subset-sum problem创建一个递归函数.我创建了一个受this answer启发的函数.
问题:我正在尝试从某个数组(例如[50,40,30,20])的数组中选择一些元素,这些数组的总和是我定义为sum(例如100)的某个值.
我已经按照该答案的建议创建了稍微修改的函数.
从前面拾取并选择它或不选择它.
如果我选择一个元素,则简化列表中的总和将小于所选元素,否则,如果我不选择该元素,则简化列表中的总和将为原始元素.
但是,我发现最困难的事情是返回跟踪到递归调用的根节点的路径.当我到达总和匹配的节点时,我可以打印路径.
这是我的功能:
private static boolean findSumFromSubList(ArrayList set, Integer sum, ArrayList result) {
if (sum < 0)
return false;
if (sum == 0) {
// Got it! Awesome! Print it!
System.out.println(result);
return true;
}
if (set.size() == 0 && sum != 0)
return false;
ArrayList newSet = new ArrayList<>(set);
newSet.remove(0);
System.out.println("Left: Picking up " + set.get(0));
result.add(set.get(0));
if (findSumFromSubList(newSet, sum - set.get(0), new ArrayList<>(result))) {
return true;
}
System.out.println("Right: NOT Picking up " + set.get(0));
result.remove(result.size()-1);
if (findSumFromSubList(newSet, sum, new ArrayList<>(result))) {
return true;
}
return false;
}
我这样称呼它:
ArrayList pair = new ArrayList<>();
pair.add(50);
pair.add(40);
pair.add(30);
pair.add(20);
ArrayList result = new ArrayList<>();
boolean resultBool = findSumFromSubList(pair, 100, result);
System.out.println("bool: " + resultBool + ", result: " + result);
我得到的输出是:
Left: Picking up 50
Left: Picking up 40
Left: Picking up 30
Right: NOT Picking up 30
Left: Picking up 20
Right: NOT Picking up 20
Right: NOT Picking up 40
Left: Picking up 30
Left: Picking up 20
[50, 30, 20]
bool: true, result: [50]
因此,我可以在递归中获取输出,但是如何将该值返回给根调用函数.因为结果仅返回50.