异想天开

What's the true meaning of light, Could you tell me why

组合数

日期:2015-05-16 08:13:38
  
最后更新日期:2015-11-25 09:32:50
http://acm.nyist.net/JudgeOnline/problem.php?pid=32
描述
找出从自然数1、2、... 、n(0到10)中任取r(0到n)个数的所有组合。
输入
输入n、r。
输出
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入
5 3
样例输出
543
542
541
532
531
521
432
431
421
321
解答:
[code lang="cpp"]
#include<stdio.h>
#include<stdlib.h>

const int LEN=11;
int a[LEN];


int solve(){
int n,r;
scanf("%d %d",&n,&r);

a[0]=n;
for (int i=0; i<r-1; ++i){
a[i+1]=a[i]-1;
}

while (a[0]>=r){
for (int i=0; i<r; ++i){
printf("%d",a[i]);
}
printf("\n");

a[r-1]--;
if (a[r-1]<1){
int index=r-1;
int min=r-index;
for (; index>=0&&a[index]<min; ){
index--;
min = r - index;
if (a[index]>=min){
a[index]--;
}
}
if (index!=r-1 && a[index]>=min){
for (int i=index; i<r-1; ++i){
a[index+1]=a[index]-1;
index++;
}
}
}
}
return 0;
}

int main()
{
solve();
return 0;
}

[/code]