描述:乙個陣列或集合物件,其下標表示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 的演算法實現 一 組合生成器 二 測試程式 三 ...