组合数

本文介绍了一种求解从自然数1至n中任取r个数的所有组合的方法。通过递归实现,确保每个组合中的数值按从大到小顺序排列,并且组合间按逆字典序排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接: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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值