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


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

优质内容筛选与推荐>>
1、XPath学习
2、jQuery file upload cropper的 click .preview事件没有绑定成功
3、Word Search II
4、python笔记2—day2
5、Codeforces #531.div3


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn