回溯法(試探法)生成彩票號碼組合(java)


試探算法思想

    試探算法也稱為回溯法,它是一種系統地搜索問題解的方法。例如在棋手思考下一步該走哪里時,就是采用試探算法:首先試想下一步所在的位置,計算對手的應對,在計算自己的對應,若對手應對與我不利,則取消該下一步設想,然后重新計算另一個下一步的位置。從一條路往前走,能進則進,不能進則退回來,換一條路再試。

1算法思路

1、定義一個解空間,它包含問題的解。

2、利用適於搜索的方法組織解空間。

3、利用深度優先法搜索解空間。

4、利用限界函數避免移動到不可能產生解的子空間。

問題的解空間通常是在搜索問題的解的過程中動態產生的,這是回溯算法的一個重要特性。

對解集合中的各個解進行試探

{

if(滿足條件)

{

保存結果

if(完成集合中所有解的試探)

輸出解

else

重復本過程進行下一步的試探(遞歸調用本函數)

}else{

恢復至上一部保存結果之前的狀態,進行另一步試探(遞歸調用本函數)

 

}

}

2.實例:生成彩票號碼組合

常見的彩票號碼都是由一些數字組成的,生成彩票號碼其實就是將所有數字進行不同的組合。例如,假設有一種彩票,每注由7個1-29的數字組成,且這七個數字不能重復。

package 練習;

public class 試探法生成彩票 {;//控制台輸出時候顯示會有一定緩存,所有結果不一定對,但是算法一定對的
    public static int MAX_=7;
    public static int NUM_=29;
public static    int num[]=new int[NUM_];
public static int lottey[]=new int [MAX_];
public static void main(String[] args) {
    
    for(int i=0;i<NUM_;i++){
          num[i]=i+1;
    }
    for(int i=0;i<MAX_;i++){
        lottey[i]=0;
    }
    conbine(NUM_,MAX_);
}
public static void conbine(int nUM_2, int mAX_2) {
    // TODO Auto-generated method stub
    for(int i=nUM_2;i>=mAX_2;i--){
        lottey[mAX_2-1]=num[i-1];
        if(mAX_2>1){
            conbine(i-1,mAX_2-1);
        }else{
            for(int c=MAX_-1;c>=0;c--)
            System.out.print(lottey[c]+" ");
            System.out.println();
        
        }
    }
}

}

 結果:

...

29 28 18 15 14 6 5
29 28 18 15 14 6 4
29 28 18 15 14 6 3
29 28 18 15 14 6 2
29 28 18 15 14 6 1
29 28 18 15 14 5 4
29 28 18 15 14 5 3
29 28 18 15 14 5 2
29 28 18 15 14 5 1

...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM