codevs 4064 组合 x
很久之前发过啦~不过删掉了...再发一下
4064 组合
时间限制: 1 s
空间限制: 256000 KB
题目等级 : 黄金 Gold
查看运行结果
题目描述 Description
组合就是从n个元素中抽出r个元素(不分顺序且r < = n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。
例如n=5,m=3所有组合为:
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
输入描述 Input Description
输入两个正整数n,m。
输出描述 Output Description
输出n个数抽选r的所有抽法。
样例输入 Sample Input
5 3
样例输出 Sample Output
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
数据范围及提示 Data Size & Hint
m<=n<=8
思路:裸的深搜2333
坑点:数组范围要开的稍大一点,不然会RE
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int n,r,cnt; bool v[999]; int ans[999]; void print() { for(int i=1;i<=cnt;i++) { printf("%d ",ans[i]); } printf("\n"); } void dfs(int now) { v[now]=1; ans[++cnt]=now; if(cnt==r) print(); for(int i=1;i<=n;i++)///find r (ge) number { if(!v[i] && i>now) { dfs(i); v[i]=0; cnt--; } } } int main() { scanf("%d%d",&n,&r); int Ms=n-r+1; for(int i=1;i<=Ms;i++) { memset(v,0,sizeof(v)); memset(ans,0,sizeof(ans)); cnt=0; dfs(i); } return 0; }