算法学习-组合问题递归解法
2017-03-10 18:16
260 查看
问题描述:
从n个整数之中任意选择k个元素,输出所有的组合。代码实现:
我们采用递归思想进行实现。代码如下:
#include <iostream> #include <string> using namespace std; void combine(int* pArray, int* pResult, int length, int n, int k) { if (0 == k) { for (int i = 0; i < length; i++) { cout << pResult[i] << " "; } cout << endl; return; } for (int i = n - 1; i >= k - 1; i--) { pResult[k - 1] = pArray[i]; combine(pArray, pResult, length, i, k - 1); } } int main(void) { int n, k; cout << "输入元素个数:"; cin >> n; cout << "输入单个组合的元素个数:"; cin >> k; int *pArray = new int ; int *pResult = new int[k]; cout << "依次输入所有元素, 以空格隔开:" << endl; for (int i = 0; i < n; i++) { cin >> pArray[i]; } cout << "组合结果:" << endl; combine(pArray, pResult, k, n, k); return 0; }运行效果:
使用模板:
我们可以定义模板,从而可以对任意类型的元素进行求解。#include <iostream> #include <string> using namespace std; template<typename T> void combine(T* pArray, T* pResult, int length, int n, int k) { if (0 == k) { for (int i = 0; i < length; i++) { cout << pResult[i] << " "; } cout << endl; return; } for (int i = n - 1; i >= k - 1; i--) { pResult[k - 1] = pArray[i]; combine(pArray, pResult, length, i, k - 1); } } int main(void) { int n, k; cout << "输入元素个数:"; cin >> n; cout << "输入单个组合的元素个数:"; cin >> k; string *pArray = new string ; string *pResult = new string[k]; cout << "依次输入所有元素, 以空格隔开:" << endl; for (int i = 0; i < n; i++) { cin >> pArray[i]; } cout << "组合结果:" << endl; combine(pArray, pResult, k, n, k); return 0; }
运行结果:
存在问题
经过测试上述解法效率并不高, 欢迎读者朋友们提供更加高效的实现方案。相关文章推荐
- 算法学习记录 N皇后问题 递归解法
- [算法]数据结构算法背包问题解法之递归解法,C语言实现
- 算法学习之递归--爬楼梯问题
- 【算法学习笔记】18.暴力求解法06 隐式图搜索2 八数码问题 未启发
- 全排列问题、八皇后问题、组合问题的递归解法
- 算法学习之递归--4个数组成24的问题
- 算法学习之递归--汉诺塔问题
- 算法——使用递归解决组合问题
- [算法]简单的背包问题递归解法,C语言实现
- 【算法】 组合数问题非递归解法
- 算法学习之递归--N皇后问题
- 【算法学习笔记】18.暴力求解法06 隐式图搜索2 八数码问题 未启发
- 【从零学习经典算法系列】分治与递归1——递归表达式与解法初步
- 经典算法之传染病问题 递归用法学习
- 北大 算法 2.4 递归 汉诺塔问题手工解法以及编译过程
- 学习算法导论-插入查询(递归实现)
- 回溯算法 8皇后问题的一种解法 适合初学者观察整个回溯的过程
- 折半查找实现算法二(递归办法)PS:编译后有一个warning,但不影响结果,代码设计上应该还有些问题
- 递归求全排列问题学习
- 打靶问题的一种递归解法