组合算法1
http://blog.sina.com.cn/s/blog_49b05ad00100dkbi.html
#include "stdafx.h"
#include "stdio.h"
/*
void combine(int a[], int n, int m, int b[], int M);
参数:
a 存放候选数字
n 总项数
m 取出项数 用于递归 递归不是原始值(变化量)
b 存放选出结果
M = m M 取出项数 用于输出数据 递归还是原始值
*/
#define MAX 5
void combine(int a[], int n, int m, int b[], int M);
int main(void)
{
int i;
int a[MAX], b[MAX];
for (i = 1; i <=MAX; i++)
a[i - 1] = i;
combine(a, MAX, 3, b, 3);
}
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");
}
}
}
组合算法2
//3.n取r的组合
#include "stdafx.h"
#include "stdio.h"
const int N = 16;
//int r = 4;
//char used[N];
int count;
void combine(int a[],int b[],int pos,int r)
{
int i;
if(pos==r)
{
for(i = 0;i<r;i++)
{
printf("%d ",a[b[i]]);
}
printf("\n");
count++;
return;
}
//这里是关键,第i个位置上的数,只能是从排在第i位的数开始的N-r个中的一个,后面的数一定要比前面的大
for(i = (pos>0?(b[pos-1]+1):pos);i<=pos+N-r;i++)
{
/*if(!used[i])*/
{
b[pos] = i;
//used[i]++;
combine(a,b,pos+1,r);
//used[i]--;
}
}
}
int main()
{
int a[N];
int b[N];
for (int i = 0; i<N; i++)
{
a[i] =i;
}
combine(a,b,0,4);
printf("%d\n",count);
}