从取球问题到含重复的组合问题模板

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);
    }
}
原文地址:https://www.cnblogs.com/jizhidexiaobai/p/8594357.html