原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=32
组合数
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
-
输入
- 输入n、r。 输出
-
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入
-
5 3
样例输出
-
543 542 541 532 531 521 432 431 421 321
#include <stdio.h>
void dfs(int n, int r ,int v){ //n代表一个数的一位数,r代表剩余位数,v代表一组和好的数
if(r == 0){ //当r为0时v已经是组合好的三位数
printf("%d\n", v);
return ;
}
if(n == 0) return; //此为失败的出口,如果n==0而r>0,则组合失败
dfs(n - 1, r - 1, v * 10 + n); //加上n,根据题目要求需要n递减进行组合,并且要从n开始,故此语句不能与下一条调换位置
dfs(n - 1, r, v); //没加n
}
int main(){
int m, n;
while(~scanf("%d%d", &n, &m))
dfs(n, m, 0);
return 0;
}
//代码2
#include <stdio.h>
void fun(int n,int r,int v){
if(r == 0){
printf("%d\n",v);
return ;
}
for(int i = n;i >= r;i -- )
fun(i - 1 ,r - 1 ,v * 10 + i);
}
int main(){
int n,r;
while(~scanf("%d%d",&n,&r))
fun(n,r,0);
return 0;
}
#include <stdio.h>
int vis[10];
int n, m;
void fun(int s, int r){
if(r == 0){
for(int i = m;i > 0;i --)
printf("%d", vis[i]);
printf("\n");
return ;
}
for(int i = s;i >= r;i --){
vis[r] = i;
fun(i - 1, r - 1);
}
}
int main(){
while(~scanf("%d%d", &n, &m))
fun(n, m);
return 0;
}