C++代码示例:组合数简单生成工具

news2025/1/12 3:47:20

文章目录

  • 前言
  • 代码仓库
  • 内容
  • 代码(有详细注释)
  • 编译和运行命令
  • 结果
  • 总结
  • 参考资料
  • 作者的话

前言

C++代码示例:组合数简单生成工具。


代码仓库

  • yezhening/Programming-examples: 编程实例 (github.com)
  • Programming-examples: 编程实例 (gitee.com)

内容

  • 简单地生成组合数
  • 有详细的步骤解析

代码(有详细注释)

ccombination.cpp

#include <vector>
#include <iostream>

using std::cout;
using std::endl;
using std::vector;

class CCombination
{
public:
    CCombination(const int &n, const int &m) : n(n), m(m), curComb(0), combCount(0) {}

    bool next()
    {
        // 第一次进入初始化当前组合,如m=3,this->curComb为012,从012开始遍历
        if (this->curComb.empty() == true)
        {
            for (int i = 0; i < this->m; ++i)
            {
                this->curComb.push_back(i);
            }

            ++this->combCount;
            return true;
        }

        // 1. 从右向左,找到第一个不存有自己最终内容的位置
        // 如n=5,m=3,curPos为索引为3-1=2的位置,从该位置的数开始递增,即先从右边的数开始递增,递增完再到左边的数
        // curPos >= 0:防止越界
        // this->curComb.at(curPos) == this->n - this->m + curPos:因为是组合数,无序,不存有自己最终内容指的是在索引2,只能取到5-3+2=4,索引1取到5-3+1=3,索引0取到5-3+0=2
        // 继续理解:比如012,前面占了01两个位置,最后的位置能取到最大值4,第二个位置因为右边的位置占位,为了保证不重复,最大值取到3,以此类推
        // 即为了保证不重复,索引0位置取值范围0~2,1位置0~3,2位置0~4,位置达到这个数说明到了最终位置,位置应该减一,用其左边的数递增
        int curPos = this->m - 1;
        while ((curPos >= 0) && (this->curComb.at(curPos) == this->n - this->m + curPos))
        {
            --curPos;
        }

        if (curPos < 0)
        {
            return false; // 已经遍历所有组合
        }

        // 2.把这个位置上的数值加1
        ++this->curComb.at(curPos);

        // 3. 后面的数值递增
        // 指的是当前位置+1后,其右边的数“归位”,只能从比它大1的数开始,否则会重复,如 014 -> 023, 034 -> 123
        for (int right = curPos + 1; right < this->m; ++right)
        {
            this->curComb.at(right) = this->curComb.at(right - 1) + 1;
        }

        ++this->combCount;
        return true;
    }

    inline void printCurComb()
    {
        for (const int c : this->curComb)
        {
            cout << c << " ";
        }
        cout << endl;
    }

    inline void printCombCount()
    {
        cout << this->combCount << endl;
    }

private:
    const int n; // 从n个取m个
    const int m;

    vector<int> curComb; // 当前组合,存储组合的索引
    int combCount;       // 组合数的数量
};

int main()
{
    const int n = 5;
    const int m = 3;
    CCombination comb(n, m);

    while (comb.next())
    {
        comb.printCurComb();
    }
    comb.printCombCount();

    return 0;
}

编译和运行命令

g++ -o ccombination ccombination.cpp
./ccombination.exe

结果

在这里插入图片描述


总结

C++代码示例:组合数简单生成工具。


参考资料

  • 学校《高级算法设计与分析》课程课件的算法思路

作者的话

  • 感谢参考资料的作者/博主
  • 作者:夜悊
  • 版权所有,转载请注明出处,谢谢~
  • 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
  • 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
  • 文章在认识上有错误的地方, 敬请批评指正
  • 望读者们都能有所收获

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1048253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

echarts 折线组件

echarts 折线组件 <template><div class"lineChartsTemplate" :id"chartsId"></div> </template><script> export default {name: "lineChartsTemplate",components: {},props: {xData: {type: Array,default: ()…

个人在运行python代码过程中的坑230928

0关于GPT和百度使用的区别 就我个人使用经验而言&#xff0c;我觉得百度、知乎、csdn更是直接奔着解决问题去的&#xff0c;直接方便快捷&#xff0c;不需要你再对信息进行加工&#xff0c;可以直接找到经验。 GPT则是需要我们给他一个输入&#xff0c;给他一个提示&#xff0…

提高网申通过率的秘籍,校园招聘之春招秋招都有效

提高网申通过率的秘籍&#xff01;校园招聘&#xff08;校招-春招-秋招&#xff09;都有效。 网申&#xff0c;指的是在网上申请招聘企业的岗位&#xff0c;每年春招秋招&#xff0c;都是毕业生们的重点大事&#xff0c;如何把握好机会&#xff0c;就在于各个环节的细节之处&…

联盟 | 彩漩 X HelpLook,AI技术赋能企业效率提升

近日&#xff0c;AI 驱动的 PPT 协作分享平台「 彩漩 」与 AI 知识库搭建工具「 HelpLook」&#xff0c;携手为用户工作流注入更多智能和创造力&#xff0c;全面拥抱 AIGC 时代带来的机遇&#xff0c;致力于提供前沿的智能解决方案。 彩 漩 彩漩是一个以 AI 技术为基础、贯彻 …

排雷Jmeter分布式性能测试,为什么要用分布式?这些易错点特别危险!

01、为什么要使用分布式 做性能测试时&#xff0c;如果被测系统性能比较好&#xff0c;或者系统项目比较大&#xff0c;那么一般都会要求能支持比较高的并发用户数。而我们做性能测试时&#xff0c;发起请求的机器&#xff0c;硬件资源是一定的&#xff0c;不可能配置无限大。…

基于Linux socket聊天室-多线程服务器模型(01)

​前言 socket在实际系统程序开发当中&#xff0c;应用非常广泛&#xff0c;也非常重要。实际应用中服务器经常需要支持多个客户端连接&#xff0c;实现高并发服务器模型显得尤为重要。高并发服务器从简单的循环服务器模型处理少量网络并发请求&#xff0c;演进到解决C10K&…

如何爬取动态加载的图片数据

百度图片是一个非常受欢迎的图片分享平台&#xff0c;其中包含了大量的图片资源。然而&#xff0c;百度图片使用了动态加载技术&#xff0c;使得Python爬虫在获取百度动态加载图片时面临一定的难度。百度图片使用了动态加载技术&#xff0c;这意味着图片并不是一次性全部加载出…

2.安装conda python库

centos 显卡驱动、cuda、cudnn安装参考地址&#xff1a; 1.centos7 安装显卡驱动、cuda、cudnn-CSDN博客 3.Cenots Swin-Transformer-Object-Detection环境配置-CSDN博客 1.安装anaconda 步骤1&#xff1a;下载 下载地址&#xff1a; Index of / 下载版本 步骤2&#xf…

深信服安全GPT 2.0升级,开启安全运营“智能驾驶”旅程

9月22日&#xff0c;深信服对外展示安全GPT落地成果与2.0升级能力。来自各行业权威嘉宾代表&#xff1a;美的集团首席信息安全官&#xff08;CISO&#xff09;兼软件工程院院长、欧洲科学院院士&#xff08;MAE&#xff09;、IEEE Fellow、IET Fellow、ACM杰出科学家、AAIA Fel…

Java集合随笔

这里写自定义目录标题 好文链接常见的方法Collections类Comparator接口HashMap 的长度为什么是 2 的幂次方&#xff1f;讲解链接 Collection部分&#xff1a; Set部分&#xff1a; HashSet&#xff1a;底层数据结构是哈希表&#xff0c;线程不安全&#xff0c;无序&#xff0…

【ArcGIS Pro二次开发】(68):计算面要素的四至点

这个工具的目的是计算面要素的四至点。 四至点并不是要素的MaxX,MaxY,MinX,MinY四个值。如果要计算这四个字&#xff0c;可以直接使用系统自带的【计算几何属性】进行计算&#xff1a; 这里要计算的是要素的最东、西、南、北的四个点坐标。 因此首先要获取这四个点&#xff0c…

vue3 - 基于ts的时间转换处理的time utils

GitHub Demo 地址 在线预览 时间转换处理的工具类 timeUtils.ts // 时间转换工具类const TimeUtils {Jh_getTimeStamp,Jh_timeStampToTime,Jh_convertTimeStamp,Jh_timeStampToYMD,Jh_isToday,Jh_getYearMonth,Jh_getPrevYear,Jh_getNextYear,Jh_getPrevYearMonth,Jh_getNex…

VSCode快速设置heder和main函数

快速设置header: 点击左侧的齿轮&#xff0c;选择User Snippets&#xff1a; 在出现的选择框中输入python&#xff0c;选择python.json 在最外层的{ }内部添加以下内容 "HEADER": {"prefix": "header","body": ["# -*- encoding:…

【运维知识高级篇】超详细的Jenkins教程3(Maven项目上线全流程)

上篇文章给大家介绍了Maven编译的内容&#xff0c;讲解了用Jenkins如何去集成Maven&#xff0c;这篇文章给大家介绍另一个的Maven项目&#xff0c;实现gitlab提交代码后&#xff0c;自动进行Maven编译&#xff0c;自动推送至web主机进行代码上线的效果。 文章目录 一、主机介绍…

【操作系统笔记八】任务调度信号处理CPU上下文

任务调度 何时需要调度执行一个任务&#xff1f; 第一&#xff1a;当任务创建的时候&#xff0c;需要决定是继续执行父进程&#xff0c;还是调度执行子进程 第二&#xff1a;在一个任务退出时&#xff0c;需要做出调度决策&#xff0c;需要从 TASK_RUNNING 状态的所有任务中选…

IDEA 2019 Springboot 3.1.3 运行异常

项目场景&#xff1a; 在IDEA 2019 中集成Springboot 3.1.3 框架&#xff0c;运行异常。 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSch…

Linux ❀ 进程出现process information unavailable时的消除方法

[rootmaster ~]# jps 74963 -- process information unavailable 78678 Jps [rootmaster ~]# cd /tmp/hsperfdata_redhat/ # redhat为启动该java进程的用户ps -ef | grep $pid查找 [rootmaster hsperfdata_redhat]# ll total 32 -rw------- 1 redhat redhat 32768 Sep 27 15:…

GaussDB数据库SQL系列-游标管理

目录 一、前言 二、概述&#xff08;GaussDB&#xff09; 1、游标概述 2、游标的使用分类 三、GaussDB中的显式游标&#xff08;示例&#xff09; 1、显式游标的使用与操作步骤 2、显式游标示例 四、GaussDB中的隐式游标&#xff08;示例&#xff09; 1、隐式游标简介…

python+requests接口自动化测试框架实例详解

前段时间由于公司测试方向的转型&#xff0c;由原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行的接口测试&#xff0c;后来&#xff0c;组内有人讲原先web自动化的测试框架移驾成接口的自动化框架&#xff0c;使用的…

通讯网关软件015——利用CommGate X2MQTT实现MQTT访问Modbus RTU

本文介绍利用CommGate X2MQTT实现MQTT访问Modbus RTU。CommGate X2MQTT是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;SCADA系统上位机、PLC、设备具备Modbus RTU通讯接口&#xff0c;现在…