組合算法 java

 import java.util.ArrayList;
 import java.util.List;


 public class Copy_2_of_StatisAnyThree {
     public static void main(String[] args) {
         Copy_2_of_StatisAnyThree s = new Copy_2_of_StatisAnyThree();
         s.printAnyThree();      
     }

     public void printAnyThree(){
         int[] num = new int[]{1,2,3,4,5,6};
         print(combine(num,3));
     }

     /**
      * 從n個數字中選擇m個數字
      * @param a
      * @param m
      * @return
      */
     public List combine(int[] a,int m){
         int n = a.length;
         
         List result = new ArrayList();
         
         int[] bs = new int[n];
         for(int i=0;i<n;i++){
             bs[i]=0;
         }
         //初始化
         for(int i=0;i<m;i++){
             bs[i]=1;
         }
         boolean flag = true;
         boolean tempFlag = false;
         int pos = 0;
         int sum = 0;
         //首先找到第一個10組合,然後變成01,同時將左邊所有的1移動到數組的最左邊
         do{
             sum = 0;
             pos = 0;
             tempFlag = true; 
             result.add(print(bs,a,m));
             
             for(int i=0;i<n-1;i++){
                 if(bs[i]==1 && bs[i+1]==0 ){
                     bs[i]=0;
                     bs[i+1]=1;
                     pos = i;
                     break;
                 }
             }
             //將左邊的1全部移動到數組的最左邊
             
             for(int i=0;i<pos;i++){
                 if(bs[i]==1){
                     sum++;
                 }
             }
             for(int i=0;i<pos;i++){
                 if(i<sum){
                     bs[i]=1;
                 }else{
                     bs[i]=0;
                 }
             }
             
             //檢查是否所有的1都移動到了最右邊
             for(int i= n-m;i<n;i++){
                 if(bs[i]==0){
                     tempFlag = false;
                     break;
                 }
             }
             if(tempFlag==false){
                 flag = true;
             }else{
                 flag = false;
             }
             
         }while(flag);
         result.add(print(bs,a,m));
         
         return result;
     }
     
     private int[] print(int[] bs,int[] a,int m){
         int[] result = new int[m];
         int pos= 0;
         for(int i=0;i<bs.length;i++){
             if(bs[i]==1){
                 result[pos]=a[i];
                 pos++;
             }
         }
         return result ;
     }
     
     private void print(List l){
         for(int i=0;i<l.size();i++){
             int[] a = (int[])l.get(i);
             for(int j=0;j<a.length;j++){
                 System.out.print(a[j]+"\t");
             }
             System.out.println();
         }
     }
} 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章