[ACM_NYOJ_32]组合数

蓝飞 蓝飞 | 时间:2013-05-05, Sun | 8,897 views
编程算法 

组合数

时间限制:3000 ms | 内存限制:65535 KB

描述

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

输入

输入n、r。

输出

按特定顺序输出所有组合。

特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。

样例输入

5 3

样例输出

543
542
541
532
531
521
432
431
421
321

来源

NYOJ32

代码如下:

#include<stdio.h>

int a[10];

void backtrack(int n, int r, int k){
	if(k >= r){
		for(int i = 0; i < r; ++i){
			printf("%d", a[i]);
		}
		printf("\n");
		return;
	}
	for(int i = (k == 0 ? n : a[k - 1] - 1); i >= 1; --i){
		a[k] = i;
		backtrack(n, r, k + 1);
	}
}

int main(){
	int n, r;
	while(~scanf("%d%d", &n, &r)){
		backtrack(n, r, 0);
	}
	return 0;
}
如需转载请注明出处:蓝飞技术部落格

当前暂无评论 »