zoukankan      html  css  js  c++  java
  • 从取球问题到含重复的组合问题模板

    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);
        }
    }
  • 相关阅读:
    高仿爱鲜蜂购物应用源码
    控制ClistCtrl的滚动的位置
    VC保存当面某个区域的图片
    MFC 屏幕截图方法
    回调函数使用(三)
    回调函数使用方法二
    VS2010编译Boost 1.57 静态链接库
    Windows7+VS2010下OpenGL的环境配置
    CxImage图像库的使用 .
    VS2010+PCL配置
  • 原文地址:https://www.cnblogs.com/jizhidexiaobai/p/8594357.html
Copyright © 2011-2022 走看看