JAVA組合演算法的乙個實現

2021-08-25 20:29:43 字數 2932 閱讀 9936

描述:乙個陣列或集合物件,其下標表示1到m個數,陣列元素的值為1表示其下標  

代表的數被選中,為0則沒選中。    

首先初始化,將陣列前n個元素置1,表示第乙個組合為前n個數。    

然後從左到右掃瞄陣列元素值的「10」組合,找到第乙個「10」組合後將其變為  

「01」組合,同時將其左邊的所有「1」全部移動到陣列的最左端。    

當第乙個「1」移動到陣列的m-n的位置,即n個「1」全部移動到最右端時,就得  

到了最後乙個組合。 

例如求5中選3的組合:    

1   1   1   0   0   //1,2,3    

1   1   0   1   0   //1,2,4    

1   0   1   1   0   //1,3,4    

0   1   1   1   0   //2,3,4    

1   1   0   0   1   //1,2,5    

1   0   1   0   1   //1,3,5    

0   1   1   0   1   //2,3,5    

1   0   0   1   1   //1,4,5    

0   1   0   1   1   //2,4,5    

0   0   1   1   1   //3,4,5  

public class combinationbean implements serializable

public void setcombinationvalue(string combinationvalue)

public boolean getstatus()

public void setstatus(boolean status)

}

public  class combinationarithmetic 

/*** 初始化基本的組合list

* @param combinationlist

* @param combinationnum

* @create_time 2011-4-27 上午11:31:26

*/public void getbasiccombination(listcombinationlist,int combinationnum)else

}return sbuffer.tostring();

}/**

* 返回'10'標識前面所有需要左移的項

* @param marker

* @param status

* @return

* @create_time 2011-4-27 下午06:25:47

*/public char processchoicemarker(string marker);

if(leftlocation>-1 && changelocation>-1)

allmarkerleft=sbuffer.tostring().tochararray();

}return allmarkerleft;

}/**

* 遞迴獲取所有的組合

* @param combinationnum

* @param basic

* @create_time 2011-4-27 下午07:01:43

*/public void compose(int combinationnum,listbasic)

this.moveleftrecurion(copycom);

result.add(copycom);

if(!this.endrecursion(combinationnum))

compose(combinationnum,copycom);

}/**

* 將'10'(選中與沒有選中的場次的組合)標識前面所有已選中的場次前移到最左邊

* @param copycom

* @create_time 2011-4-27 下午06:02:49

*/public void moveleftrecurion(listcopycom)

}if(count==combinationnum)

status=true;

}return status;

}/**

* 判段這兩場比賽是否是被選中和沒有被選中即'10'組合

* @param com

* @param combean

* @return

* @create_time 2011-4-27 下午07:04:21

*/public boolean judgeexchangecondition(combinationbean com,combinationbean combean)

/*** 得到所有的組合並拼接到一起

* @return

* @create_time 2011-4-27 下午07:04:55

*/public listgetcomresult(int combinationnum)

if(combinationbean.getstatus() && count!=combinationnum)

}allcomresult.add(sbuffer.tostring());

} setset = new hashset();

for (string com : allcomresult)

for (iteratoriter = set.iterator(); iter.hasnext();)

comresult.clear();

comresult.addall(set);

return comresult;

}public listgetbasiccombination()

}

乙個簡單的字元組合演算法

有個朋友問了我這個問題 把幾個陣列裡面的元素任意組合 並輸出所有組合。c 中是有相關的函式,我們自己來實現一下吧。當然大家一開始就會想到用遞迴,下面就給出簡單的原始碼。include using namespace std char arr 100 100 void work int row,int...

組合演算法實現

組合 乙個集的元素的組合是乙個子集。s的乙個k 組合是s的乙個有k個元素的子集。組合具有無序性。若兩個子集的元素完全相同僅順序不同,看作同乙個組合。組合符號 這裡介紹4中常見的組合形式 1.完全組合。2.不重複完全組合。3.選擇組合。4.有重複選擇組合。1.完全組合 從n元素集s中取出所有的k個元素...

乙個排列組合演算法 裂變演算法

2009年1月15日 瀋陽 晴 為解決1月7日遇到的排列組合的難題,進行了以下題目的研究,並用c 實現了乙個非遞迴的演算法。有乙個list,list中存有n個物件,要求做出這n個物件所有無序組。數學公式 組合數 c n,1 c n,2 c n,n c 的演算法實現 一 組合生成器 二 測試程式 三 ...