排列組合演算法總結 基於C 實現

2021-08-16 04:39:34 字數 2246 閱讀 6456

全排列n!

1.1 遞迴法

設一組數p = , 全排列為perm(p),pn = p – 。則perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), … , rnperm(pn)。當n = 1時perm(p} = r1。

如:求的全排列

1、首先看最後兩個數4, 5。 它們的全排列為4 5和5 4, 即以4開頭的5的全排列和以5開頭的4的全排列。

由於乙個數的全排列就是其本身,從而得到以上結果。

2、再看後三個數3, 4, 5。它們的全排列為3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六組數。

即以3開頭的和4,5的全排列的組合、以4開頭的和3,5的全排列的組合和以5開頭的和3,4的全排列的組合.

#include 

using

namespace

std;

void perm(int start, int end, int a)

for (int i = start; i < end; i++)

}int main()

perm(0, n, a);

}return

0;}

c(n,k),n個數中任取k個數

2.1 遞迴法

實際上就是在n個數中,標記k個數,然後輸出這k個數的過程。使用乙個visited陣列來記錄相應下標的數是否被選中。

#include 

using

namespace

std;

void dfs(int pos, int cnt, int n, int k, int a,bool visited)

//處理到最後乙個數,直接返回

if (pos == n) return;

//如果a[pos]沒有被選中

if (!visited[pos])

//處理在子串a[pos+1, n-1]中取出k個數的問題

dfs(pos + 1, cnt, n, k, a, visited);

}int main()

dfs(0, 0, n, k, a, visited);

delete a;

delete visited;

}getchar();

return

0;}

2.2 『01』轉換法

本程式的思路是開乙個陣列,其下標表示1到n個數,陣列元素的值為1表示其代表的數被選中,為0則沒選中。

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

然後從左到右掃瞄陣列元素值的「10」組合,找到第乙個「10」組合後將其變為「01」組合,同時將其左邊的所有「1」全部移動到陣列的最左端。

當第乙個「1」移動到陣列的n-m的位置,即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

#include 

using

namespace

std;

//輸出結果

void printres(int* a, bool* index, int n)

}cout

<< endl;

}//檢查最後k個位置是否已全變成0

bool hasdone(bool* index, int n, int k)

}return

true;

}void comb(int* a, int n, int k)

printres(a, index, n);

while (!hasdone(index, n, k))

}printres(a, index, n);

break;}}

}delete index;

}int main()

comb(a, n, k);

delete a;

}return

0;}

排列組合演算法實現

全排列表示把集合中元素的所有按照一定的順序排列起來,使用p n,n n 表示n個元素全排列的個數。例如 的全排列為 123 132 213 231 312 321 共6個,即3!321 6。這個是怎麼算出來的呢?首先取乙個元素,例如取出了1,那麼就還剩下。然後再從剩下的集合中取出乙個元素,例如取出2...

c 排列組合演算法

combinatorics.cs 清單 usingsystem usingsystem.collections usingsystem.data 組合數學函式集 publicclasscombinatorics returndt 連乘積函式 publicstaticintproduct intsta...

排列 組合 演算法 C

class b c list,3 console.writeline a list,0,4 對陣列進行組合操作,選取selectcount個元素進行組合 即將進行組合操作的陣列 選取的元素的個數 static void c listlsarray,int selectcount while true...