組合演算法
本程式的思路是開乙個陣列,其下標表示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
全排列演算法
從1到n,輸出全排列,共n!條。
分析:用n進製的方法吧。設乙個n個單元的陣列,對第乙個單元做加一操作,滿n進
一。每加一次一就判斷一下各位陣列單元有無重複,有則再轉回去做加一操作,沒
有則說明得到了乙個排列方案。
例如:求1-3的全排列,共3!條
設陣列初始狀態為0 0 0,以下
為計算全排列的步驟:
0 0 0 +1
1 0 0 +1
2 0 0 +1
3 0 0 滿3進1 -
>
0 1 0 +1
1 1 0 +1
2 1 0 +1
3 1 0 滿3進1 -
>
0 2 0 +1
1 2 0 +1
2 2 0 +1
3 2 0 滿3進1 -
>
0 3 0 滿3進1 -
>
0 0 1 +1
1 0 1 +1
2 0 1 +1
3 0 1 滿3進1 -
>
0 1 1 +1
1 1 1 +1
2 1 1 +1
3 1 1 滿3進1 -
>
0 2 1 +1
1 2 1 +1
2 2 1 +1
3 2 1 滿3進1 -
>
0 3 1 滿3進1 -
>
0 0 2 +1
1 0 2 +1
2 0 2 +1
3 0 2 滿3進1 -
>
0 1 2 +1
1 1 2 +1
2 1 2 +1
3 1 2 滿3進1 -
>
0 2 2 +1
1 2 2 +1
2 2 2 +1
3 2 2 滿3進1 -
>
0 3 2 滿3進1 -
>
0 0 3 滿3進1 -
>
0 0 0
共6個yes,每乙個對應一種排列
參考:http://blog.csdn.net/maybehelios/archive/2006/05/28/759315.aspx#698262
全排列問題我的第一意識也是用遞迴:
如1234,排列時分別為第一位取1,2,3,4;如取完1後,剩2,3,4,再分別為第二位取2,3,4;如取2,則剩3,4……這樣遞迴下去即可。有點像數學裡面求乙個全排列總數的方法,即先填第乙個,有5種,再填第二個有4種,最後正好是1*2*3*4=24種。
4選2時:4位二進位制數共有2的4次方種。(該位為1代表組合中含有此數)
0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111,只要找出其中有二個1的即可。更易理解。
第一段演算法是正確的,swy114,那個例子,是錯誤的,因為他只僅僅把第乙個碰到的10,換成01,而沒有把左右所有的1都移動左邊,即從頭再開始填為1.
11000
10100
01100
10010
01010
00110
10001
01001
00101
00011
4個數的
1100
1010
0110
1001
0101
0011
排列組合演算法
在開發的過程中很難免會到排列組合,剛開始通過for迴圈來搞定。但是對於工作了近五年的我而已,不能像 新人那樣做了。如果所要組合的集合大於40,你不可能寫40個for迴圈吧!這裡使用了數學的演算法,到底是啥演算法,高人也沒說!不過我把它的思想提公升了一下。如下 ifndef combination h...
排列組合演算法
1.排列演算法 include define max num 100 void print int n,int num void swap int a,int b int arrange int i,int n,int num i return count int combination int u...
排列組合演算法
組合演算法的思路是開乙個陣列,其下標表示1到m個數,陣列元素的值為1表示其下標代表的數被選中,為0則沒選中。初始化,將陣列前n個元素置1,表示第乙個組合為前n個數。從左到右掃瞄陣列元素值的 10 組合,找到第乙個 10 組合後將其變為 01 組合,同時將其左邊的所有 1 全部移動到陣列的最左端。當第...