是否可以使用for循环编写子集求和算法?我假设运行时间为O(2 ^ n)
答案 0 :(得分:0)
请参阅wiki
你可以使用动态编程在O(n x sum)时间复杂度中实际解决它。 但它还需要O(n x sum)的空间复杂度来存储以自下而上的方式填充的布尔表。你可以为它解决它的解决方案。
只考虑for loop
我认为你的意思是,不使用动态方法。然后我们就像你说的那样具有指数复杂性。
答案 1 :(得分:0)
public static ArrayList<ArrayList<Integer>> powerSet(List<Integer> intList) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
result.add(new ArrayList<Integer>());
for (int i : intList) {
ArrayList<ArrayList<Integer>> temp = new ArrayList<ArrayList<Integer>>();
for (ArrayList<Integer> innerList : result) {
innerList = new ArrayList<Integer>(innerList);
innerList.add(i);
temp.add(innerList);
}
result.addAll(temp);
}
return result;
}
public static List<Integer> subsetSum(int[] group){
List<Integer> mySet = new ArrayList<>();
for(int i=0;i<group.length;i++){
mySet.add(group[i]);
}
ArrayList<ArrayList<Integer>> setArry=powerSet(mySet);
for (int i=0;i<setArry.size();i++){
ArrayList<Integer> oneSet= setArry.get(i);
if(oneSet.size()>0){
int sum =0;
for (int t=0;t<oneSet.size();t++){
sum+=oneSet.get(t);
}
if(sum==0){
return oneSet;
}
}
}
return null;
}
public static void main(String[] args){
List<Integer> res = subsetSum(group);
if(res!=null){
for (Integer i:res) {
System.out.print(i+" ");
}
}else {
System.out.println("false");
}
}
powerSet credit Calculating all of the subsets of a set of numbers