【发布时间】:2020-03-20 02:39:01
【问题描述】:
问题描述:
给定一个整数列表和一个目标总和,我们需要返回另一个包含布尔值的列表。这个布尔列表表示我们正在寻找的子集。
示例:
输入:列表 (3, 34, 4, 12, 5, 2),目标 = 9。
输出:(假,假,真,假,真,假)(因为 4+5 = 9;注意这个解不是唯一的,但问题只要求一个任意解)。
我的尝试:
我开始编写一个方法来检查解决方案是否存在:
boolean subsetSumRec(List<Integer> list, int i, int sum) { //i is the index of the last element in list
if(sum==0){
return true;
} else if(i<0 || sum<0){
return false;
}
boolean include = subsetSumRec(list,i-1,sum-list.get(n));
boolean exclude = subsetSumRec(list,i-1,sum);
return include || exclude;
}
我创建了一个新的 ArrayList (type: Boolean) resultList,这将是输出。我的计划是在方法subsetSumRec 中更新resultList。它会是这样的:
private boolean subsetSumRec(List<Integer> list, int i, int sum) {
if(sum==0){
return true;
} else if(list.size()<=0 || sum<0){
return false;
}
res.add(true);
boolean include = subsetSumRec(list,i-1,sum-list.get(i));
boolean exclude;
if(include == false){
res.remove(true);
res.add(false);
exclude = subsetSumRec(list, i - 1, sum);
}
return include || exclude;
}
这没有给出所需的结果,但我不知道出了什么问题。如何优化?
如果在 subsetSumRec 中更新 resultList 不是一个选项,那么我必须摆脱检查是否有解决方案的方法并使用回溯算法(没有动态编程!)。我不知道如何从最后一个开始。有人可以给我提示如何解决这个问题的回溯算法(伪代码?)。
提前致谢。
【问题讨论】:
-
“这没有给出所需的结果,但我看不出有什么问题。如何优化?” 首先,您需要将问题编辑为具体说明结果有什么问题。 stackoverflow.com/help/minimal-reproducible-example 其次,优化给出错误答案的算法只意味着你会更快地得到错误答案。
-
if(include = false)是什么意思?你是说if(include == false)吗?
标签: java algorithm backtracking subset-sum