组合
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 508(161 users) Total Accepted: 279(153 users) Rating: Special Judge: No
Description
给出一个正整数N,从集合{1,2,3…N} 中找出所有大小为k的子集, 并按照字典序从小到大输出。
Input
第一行是一个整数T,代表T组测试数据。
接下来T行,每行是两个正整数n(1<=n<=10), k(1<=k<=n)。
Output
对于每组数据按字典序输出所有符合条件的子集。
Sample Input
1
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
注意剪枝
/*
Status:Accepted
Time:23ms
Memory:456kB
Length:421
Lang:G++
Submitted:2019-08-23 08:47:26
RemoteRunId:891934
**/
#include<iostream>
#include<cstring>
using namespace std;
int n,k;
int a[10],b[10];
void dfs(int step){
if(step==k+1){
for(int i=1;i<=k-1;i++){
cout<<a[i]<<" ";
}cout<<a[k]<<endl;
return;
}
for(int i=1;i<=n;i++){
if(i>a[step-1]&&b[i]==0){//保证了下一个数一定大于上一个数,剪枝。
b[i]=1;
a[step]=i;
dfs(step+1);
b[i]=0;
}
}
}
int main(){
int t;
cin>>t;
while(t--){
memset(b,0,sizeof(b));
cin>>n>>k;
dfs(1);
}
return 0;
}