这就是一个dfs递归的思想,感觉不太好理解,自己动手模拟一下吧

AC代码:

#include <iostream>
#include <cstring>
using namespace std;
int temp[5050];
int num;

void dfs(int n,int m){
  for(int i=n;i>=1;i--){        // 从n开始从大到小递归
    temp[m] = i;       // 记录i
    if(m>1){           // 当记录的数不够m个时进行递归
      dfs(i-1,m-1);    // 下一层比上一层小1
    }
    else{              // 当已经记录的数够了m个时输出
      for(int i=num;i>=1;i--){
        cout<<temp[i];
      }
      cout<<endl;
    }
  }
}

int main()
{
  int n,m;
  while(cin>>n>>m){
    num = m;    // 标记个数
    dfs(n,m);
  }
  return 0;
}
/***
   [来源] NYOJ 32
   [题目] 组合数
   [思路]
      递归思想
   [输入]
      5 3
   [输出]
      543
      542
      541
      532
      531
      521
      432
      431
      421
      321
*/