全排列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...