public void TestOptional(){
//需要求的列表
List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3));
//存取可能结果的容器,使用List<List<Integer>>更好
List<String> lists = new ArrayList<>();
//添加进第一个元素,便于接下来类动态规划迭代
lists.add(Integer.toString(list.get(0)));
int i = 1,m,temp;
/*
m为每个添加操作前的目标容器的大小
temp代表第i个元素的大小
*/
while (i<list.size()) {
temp = list.get(i++);
m = lists.size();
//每次添加进当前元素
lists.add(Integer.toString(temp));
//分解子问题,f(n)等于f(n-1)的所有子集加上索引为n的元素
for (int j = 0; j < m ; j++){
lists.add( lists.get(j) + " " + temp );
}
}
//打印结果,因为单纯为了测试算法
//忽略了列表为空列表以及子集中包含空子集的情况
lists.forEach(s -> System.out.println(s));
}
结果:
1
2
1 2
3
1 3
2 3
1 2 3
有错误的话希望大神能指出,我还是个算法渣,每天记录一下自己的小练习,谢谢!