实现比较简单,主要复习一下剪枝的方法:
- 
优先搜索结果小的分支 
- 
排除等效冗余 
- 
可行性剪枝 
- 
最优剪枝 
- 
记忆化DP 
这里基本就是一个暴力搜索的问题,只能用到可行性剪枝。
#include <iostream>
#include <vector>
using namespace std;
const int N = 30;
int n,m;
int path[N];
void dfs(int u,int idx) {
    if(n - idx + u + 1 < m) return;
    if(u == m) {
        for(int i = 0;i < m;i++) cout << path[i] << ' ';
        cout << endl;
        return;
    }
    for(int i = idx;i <= n;i++) {
        path[u] = i;
        dfs(u + 1,i + 1);
        path[u] = 0;
    }
}
int main(){
//     freopen("input.txt","r",stdin);
    cin >> n >> m;
    dfs(0,1);
    return 0;    
}

 京公网安备 11010502036488号
京公网安备 11010502036488号