public class Main { // m个不同的球中,取n个 static int f(int m, int n){ if(n==m) return 1; if(n==0) return 1; return f(m-1,n) + f(m-1,n-1); } public static void main(String[] args){ System.out.println(f(5,3)); System.out.println(f(5,2)); } }
// 固定数目的组合问题 // ABCDE 中取3个 public class B { public static void main(String[] args){ for(char i='A'; i<='E'; i++){ for(char j=(char)(i+1); j<='E'; j++){ for(char k=(char)(j+1); k<='E'; k++){ System.out.println(""+i+j+k); } } } } }
import java.util.*; // 递归思路:第1次取什么? public class C { static List f(String s, int n){ List lst = new Vector(); if(n==0){ lst.add(""); return lst; } for(int i=0; i<s.length(); i++){ char x = s.charAt(i); List t = f(s.substring(i+1),n-1); for(int k=0; k<t.size(); k++){ lst.add("" + x + t.get(k)); } } return lst; } public static void main(String[] args){ List lst = f("ABCDE", 3); for(int i=0; i<lst.size(); i++){ System.out.println(lst.get(i)); } } }
// "AABBBC" 取3个, 哪些取法? public class D { static void work(int[] x){ for(int i=0; i<x.length; i++){ for(int k=0; k<x[i]; k++){ System.out.print((char)('A'+i)); } } System.out.println(); } // data: 不动, 限制条件 // x: 取法 // k: 当前考虑的位置 // goal: 距离目标的剩余名额 static void f(int[] data, int[] x, int k, int goal){ if(k==x.length){ if(goal==0) work(x); return; } for(int i=0; i<=Math.min(data[k],goal); i++){ x[k] = i; f(data, x, k+1, goal-i); } x[k] = 0; // 回溯 } public static void main(String[] args) { int[] data = {2,3,1}; // 每个元素的最大个数 int[] x = new int[data.length]; // 每个元素取几个 f(data, x, 0, 3); } }