组合数问题 (Mathematics)

题目:

描述
找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。

输入

输入n、r。
输出
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入
5 3
样例输出
543
542
541
532
531
521
432
431
421
321
 
递归很好解决!
为什么是递归?
f(n,r),确定了第一个数后,剩下的问题就是从其余n-1个数里找r-1个数的组合,即f(n-1,r-1);当第二个参数是1时,说明找到一个组合了,就输出。
循环+递归;在纸上画一下程序的执行流程就非常清晰了!

代码:

#include<stdio.h>

void fun(int n,int k);
int a[10];

int main()
{
int n,r;
scanf("%d%d",&n,&r);
a[0] = r;// 保存组合数的长度
fun(n,r);

// system("pause");
return 0;
}

void fun(int n,int k)
{
int i,j;

for(i = n ; i > 0 ; --i)//每个递归里也有这个循环!!!
{
a[k] = i;
if(k > 1 )
fun(i-1,k-1);//递归,不是fun(n-1,k-1),否则会重复的
else
{
for(j = a[0]; j > 0 ; --j)
printf("%d",a[j]);
printf("\n");
}
}
}
 
原文地址:https://www.cnblogs.com/HpuAcmer/p/2261524.html