Problem P30. [算法课分支限界法]组合

分支树的思想遍历所有可能性,然后加上限制条件,剪枝掉不符合条件的分支,比如只能选出k个数进行组合,那么curk==k时结束这个分支,还有就是注意边界的问题,curn>n

#include<iostream>
#include<bits/stdc++.h>
#include<cstdio>
#include<string>

using namespace std;

vector<string> strs;

int n=0, k=0;

template<typename T> string toString(const T& t){
    ostringstream oss;  //创建一个格式化输出流
    oss<<t;             //把值传递如流中
    return oss.str();
}

void bfs(int curk, int curn, string curstr){
    if (curk==k){
        strs.push_back(curstr);
        return;
    }
    if (curn>n){
        return;
    }
    if (curk>0){
        bfs(curk+1, curn+1, curstr+" "+toString(curn));
    }else {
        bfs(curk+1, curn+1, curstr+toString(curn));
    }
    bfs(curk, curn+1, curstr);
}

int main()
{
    cin >> n >> k;
    bfs(0, 1, "");
    for (int i = 0; i < strs.size(); i++){
        cout << strs[i] << "\n";
    }
    return 0;
}

posted @   白缺  阅读(126)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示