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);
}
}