转载自http://www.cnblogs.com/shuaiwhu/archive/2012/04/27/2473788.html 作者:Microgoogle
思路:递归遍历思想。按数组下标从小到大,如果从5个数中取出4个数,则第一个数与第二个数,至少要选择一个。之后从剩余的数中选择3个,方法与之前相同,依次递归。即,如果要从array[p...q]中选择m个数(m<=q-p+1), 则必须从array[p...q-count+1]选择一个。假设选择了array[r],随后从array[r+1...q]中选择m-1个数。故递归外层循环是对取array[p...q-count+1]的遍历。
代码如下:
#include <cstdio>
#include <cstdlib>
using namespace std;
int arr[5] = {1, 2, 3, 4, 5};
int ARR_LEN = 5;
int NUM = 4;
int result[4];
void combination(int start, int count)
{
for(int i = start; i < ARR_LEN + 1 - count; i++)
{
result[count - 1] = i;
if(count - 1 == 0)
{
for(int j = NUM - 1; j >= 0; j--)
printf("%d ", arr[result[j]]);
printf("\n");
}
else
combination(i + 1, count - 1);
}
}
int main(void)
{
combination(0, 4);
return 0;
}