1. 程式人生 > >NYOJ 32--組合數【DFS】

NYOJ 32--組合數【DFS】

組合數

時間限制: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 <cstdio>
#include <cstring>

int n,r,d;
int a[1000];
int b[1000];

int dfs(int pos){
	if(d==r+1){
		for(int i=1;i<=r;i++)
			printf("%d",a[i]);
		printf("\n");
	}
	for(int i=pos;i<=n;++i){
			a[d]=b[i];
			d++;
			dfs(i+1);
			d--;
	}
}

int main (){
	while(scanf("%d%d",&n,&r)!=EOF){
	    int c=1;
        for(int i=n;i>=1;i--)
            b[c++]=i;
		d=1;
		dfs(1);
	}
	return 0;
}