我这个才是最容易记住的思路。。。
从n个元素里面取出m个组合等于 (先从组合里面取出一个元素e,再从n-1个元素里面取出m-1个元素)加上(排除元素e,从n-1个元素里面直接取出m个元素)
也就是 C(m,n)=C(m-1,n-1)+C(m,n-1)
多清晰的递归思路
package test;
import java.util.*;
import java.util.stream.Collectors;
public class MyDp {
public static void main(String[] args) {
Object[] elements = { "a", "b", "c", "d" };
List<List<Object>> combinations = new ArrayList<>();
// 求 C(n,1)+C(n,2)+C(n,3)+...+C(n,m-1)+C(n,m) 这里n=m
for (int i = 1; i <= elements.length; i++) {
combinations.addAll(combinations(Arrays.asList(elements), elements.length, i));
}
for(List<Object> eSet : combinations) {
System.out.println(Arrays.deepToString(eSet.toArray()));
}
}
//从n个组合里面取出m个元素
private static List<List<Object>> combinations(List<Object> elements, int n, int m) {
List<List<Object>> ret = new ArrayList<>();
//如果从n个元素里面取出一个元素,每个元素都是一个单独的组合,结果返回
if (m == 1) {
for (Object e : elements) {
List<Object> elementSet = new ArrayList<>();
elementSet.add(e);
ret.add(elementSet);
}
return ret;
}
// 如果从n个元素里面取出m>1个元素,利用递归思路 C(m,n)=C(m-1,n-1)+C(m,n-1)
List<Object> tElements = new ArrayList<>(elements);
for (Object e : elements) {
tElements.remove(e); //元素删除
ret = combinations(tElements, n - 1, m - 1); // 包含e元素
for (List<Object> eSet : ret) {
eSet.add(e);
}
ret.addAll(combinations(tElements, n - 1, m));// 不包含e元素
tElements.add(e); //元素回填
}
return ret;
}
}
--
修改:iStudy FROM 58.37.127.*
FROM 58.37.127.*