组合数
时间限制: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<iostream> using namespace std; int a[11],n,r; //pre为所求前一位数,step为所求第step个数 void dfs(int pre,int step) { if(step>r) { for(int i=1;i<=r;i++) cout<<a[i]; cout<<endl; return; } //i>r-step保证后面有足够的数字选 for(int i=pre-1;i>r-step;i--) { a[step]=i; dfs(i,step+1); } } int main() { cin>>n>>r; for(int i=n;i>=r;i--) { a[1]=i; dfs(i,2); } return 0; }