C++ 全排列和组合算法(递归)
2013-09-23 18:02
471 查看
全排列:
设待排列的数组为a
,任意时刻将其分为0~s-1和s~n-1两端。
其中,0~s-1是已经选择的区间,s~n-1是待选择的区间,每次选择s~n-1的一个与s为的数交换
组合算法:
从大小为n的数组a
中找到所有大小为m的组合
递归函数 comp(int *a, int h, int k, int *sub) 表示在数组a的前h个数中选择k个,因为要保证下一次递归时可以选择k-1个,所以本次选择的范围是a[i], 其中k-1<= i <= h-1,并将a[i]复制给已选集sub[k-1],
并进行下一次递归 comp(a, i, k-1, sub) 表示在数组a的前i个数中选择k-1个
设待排列的数组为a
,任意时刻将其分为0~s-1和s~n-1两端。
其中,0~s-1是已经选择的区间,s~n-1是待选择的区间,每次选择s~n-1的一个与s为的数交换
#include <iostream> using namespace std; void swap(int *a, int i, int j) { int tmp = a[i]; a[i] = a[j]; a[j] = tmp; } //0~s-1, s~n-1 void perm(int *a, int s, int n) { if(s >= n) { for(int i = 0; i < n; i++) { cout << a[i] << ","; } cout << endl; } else { for(int i = s; i < n; i++) { swap(a, s, i); perm(a, s+1, n); swap(a, s, i); } } } int main() { int n; cin >> n; int a[100]; for(int i = 0; i < n; i++) { cin >> a[i]; } perm(a, 0, n); return 0; }
组合算法:
从大小为n的数组a
中找到所有大小为m的组合
递归函数 comp(int *a, int h, int k, int *sub) 表示在数组a的前h个数中选择k个,因为要保证下一次递归时可以选择k-1个,所以本次选择的范围是a[i], 其中k-1<= i <= h-1,并将a[i]复制给已选集sub[k-1],
并进行下一次递归 comp(a, i, k-1, sub) 表示在数组a的前i个数中选择k-1个
#include <iostream> using namespace std; int n; int m; int num = 0; void comb(int *a, int h, int k, int *sub) { if(k == 0) { for(int i = 0; i < m; i++) { cout << sub[i] << ","; } cout << endl; num ++; } else { for(int i = h-1; i >= k-1; i--) { sub[k-1] = a[i]; comb(a, i, k-1, sub); } } } int main() { int n; cin >> n >> m; int a[100], sub[100]; for(int i = 0; i < n; i++) { cin >> a[i]; } comb(a, n, m, sub); cout << num << endl; return 0; }
相关文章推荐
- 递归全排列c++
- 数据结构与算法(C++)--perm(排列--递归完成)
- c/c++递归实现排列Permutations
- 字符串的全排列和组合算法(递归非递归)
- C++ 递归位置排列算法及其应用
- 排列和组合简单的递归思路以及C++实现
- 非递归枚举排列组合(C++)
- C++利用递归求排列的代码
- C++ 递归位置排列算法及其应用
- c++ 递归实现不同字母的全排列组合
- 排列算法及组合算法(C++)
- 非递归全排列算法 c++
- 非递归枚举排列组合(C++)
- C/C++ 排列组合问题(递归)
- c++字符串全排列递归法
- C++_递归排列产生器
- C++:数组排列组合的问题。
- 非递归生成所有排列(knuth)
- C++ 实现求二叉树的深度及便利(递归与非递归算法)
- 递归全排列