C++ 排列组合
2016-08-29 12:50
330 查看
从n个数中取m个的随机组合。
看起来很简单的东西,实现起来真烦。。。。。。搞了一个多小时才想明白。
#include
using namespace std;
void combine(int a[], int n,int m , int b[], int M)
{
int i, j;
for (i = n; i >= m; i--)
{
b[m - 1] = i - 1;
if (m > 1)
combine(a, i - 1, m - 1,
b, M);
else
{
for (j
= M - 1; j >= 0; j--)
printf("%d ", a[b[j]]);
printf("\n");
}
}
}
int main(){
int a[4] = {1,2,3,4};
int b[20];
combine(a,4,2,b,2);
}
核心思想就是比如我们要取3个组合, 从大往小取,先取4 b[m - 1] =
i - 1;),然后再在剩下的数组(3,2,1)中取一个,然后再在剩下的数组中去一个。
反正取3次。
每次for (i = n; i >= m; i--)
这个for循环其实只给 b[m - 1] = i - 1;
赋值1次。
我们还是从大往小取,递归 combine(a, i - 1, m - 1, b, M);
我们可以看出combine(a, i - 1, m - 1, b, M);
下一轮是combine(a,3, 3 - 1, b,
3);
这个递归中其实包含了(3,2,1) 取3个的排列组合。
然后combine(a,3, 2, b, 3);
再下面就是combine(a,2, 1, b, 3);
递归结束
可以看到一共3层递归。每一层其实都返回了一个b[m - 1] 。。。。循环打印出来。
再看看combine(a,5, 3, b, 3);
反正选几个数排列,递归深度就是几。递归3
看起来很简单的东西,实现起来真烦。。。。。。搞了一个多小时才想明白。
#include
using namespace std;
void combine(int a[], int n,int m , int b[], int M)
{
int i, j;
for (i = n; i >= m; i--)
{
b[m - 1] = i - 1;
if (m > 1)
combine(a, i - 1, m - 1,
b, M);
else
{
for (j
= M - 1; j >= 0; j--)
printf("%d ", a[b[j]]);
printf("\n");
}
}
}
int main(){
int a[4] = {1,2,3,4};
int b[20];
combine(a,4,2,b,2);
}
核心思想就是比如我们要取3个组合, 从大往小取,先取4 b[m - 1] =
i - 1;),然后再在剩下的数组(3,2,1)中取一个,然后再在剩下的数组中去一个。
反正取3次。
每次for (i = n; i >= m; i--)
这个for循环其实只给 b[m - 1] = i - 1;
赋值1次。
我们还是从大往小取,递归 combine(a, i - 1, m - 1, b, M);
我们可以看出combine(a, i - 1, m - 1, b, M);
下一轮是combine(a,3, 3 - 1, b,
3);
这个递归中其实包含了(3,2,1) 取3个的排列组合。
然后combine(a,3, 2, b, 3);
再下面就是combine(a,2, 1, b, 3);
递归结束
可以看到一共3层递归。每一层其实都返回了一个b[m - 1] 。。。。循环打印出来。
再看看combine(a,5, 3, b, 3);
反正选几个数排列,递归深度就是几。递归3
相关文章推荐
- 用 Eclipse 平台进行 C/C++ 开发
- hadoop streaming的单词统计C++版
- C++ 学习积累-不断更新
- Visual C++ MFC 简明教程--第四部…
- 《C++ Primer》学习笔记
- c/c++ 管道编程
- 《Visual C++ 技术内幕(第四版)…
- JavaScript 调用 C++
- C/C++ 中如何获取数组长度
- Visual C++ MFC 简明教程--第二部…
- 在c++中 struct 和class
- C++ : virtual函数和纯virtual函数
- C++ : Complex numbers library
- 使用 C++ 来编写 Web 应用
- C++ 使用 string 型態
- hadoop c++ pipes接口实现
- python 中用SWIG包装C和C++和接口…
- stack implement  C++
- C++ 学习 二
- Visual C++ MFC 简明教程--第一部…