组合数

来源:互联网 发布:佳明软件下载 编辑:程序博客网 时间:2024/05/01 18:39

原题链接: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
样例输出
543542541532531521432431421321
#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;}





0 0