回朔法——数字组合问题

来源:互联网 发布:一人开十几个淘宝店 编辑:程序博客网 时间:2024/05/16 02:56

输入两个整数n和m,从数列1,2,3…n中随意取几个数,使其和等于m,要求列出所有的组合。
法一:搜索整个二叉树

static int sum=10;    static int x[];//访问标记    public static void main(String[] args) {        int a[]=new int[]{1,2,3,4,5,6,7,8};        x=new int[a.length];        for(int i=0;i<x.length;i++)            x[i]=0;        fuck(a,0);    }    private static void fuck(int[] a, int step) {        if(step==a.length){            int temp=0;            for(int i=0;i<x.length;i++)                if(x[i]==1)                    temp+=a[i];            if(temp==sum){                for(int i=0;i<x.length;i++)                    if(x[i]==1)                        System.out.print(a[i]+",");                System.out.println();            }        }else{            for(int i=0;i<=1;i++){                x[step]=i;                fuck(a,step+1);            }        }    }

法二:经过优化,相当于剪枝,省去不必要的递归过程,效率更高

static int sum=10;        static int currentSum=0;        static int x[];//访问标记public static void main(String[] args) {    int a[]=new int[]{1,2,3,4,5,6,7,8};    x=new int[a.length];    for(int i=0;i<x.length;i++)        x[i]=0;    fuck(a,0);}        private static void fuck(int[] a, int step) {            if(step==a.length){                if(currentSum==sum){                    for(int i=0;i<x.length;i++)                        if(x[i]==1)                            System.out.print(a[i]+",");                    System.out.println();                }            }else{                for(int i=0;i<=1;i++){                    x[step]=i;                    if(i==0){                        fuck(a,step+1);                    }else{                        if(currentSum+a[step]<=sum){ //有条件的递归,这相当于剪枝,舍去不必要的递归过程                            currentSum+=a[step];                            fuck(a,step+1);                            currentSum-=a[step];                        }                    }                }            }        }
0 0
原创粉丝点击