位运算骚操作---利用位运算求组合数

2023-05-16

文章目录

  • 一道利用组合求和的例题
  • 位运算如何实现组合的呢?
  • 解题代码

一道利用组合求和的例题

在这里插入图片描述

这道题乍一看就是把所有的组合给列举出来,然后求和看是否等于目标值,输出需要注意的是优先输出靠前的下标元素,那么这就很巧了朋友们,位运算恰好能优雅的实现这一操作

位运算如何实现组合的呢?

  • 我们先观察一下这道题,它需要的组合数是不确定的,也就是不知道是取几个数的组合,这样显然可以直接深搜,而我们同样也可以通过位运算实现,由于组合数不确定,则总的组合数就是 C n k ( 0 = < k < = n ) C_{n}^{k}(0=<k<=n) Cnk(0=<k<=n)学过高中数学的显然都知道总和为2的n次方,当然你也可以直接看作n个数里面每个数有取和不取两种选择,总的选择就是这么多。
  • 现在我们来聊聊二进制数的基本列举,比如0~7:000、001、010、011、100、101、110、111,我们如果假设有三个数字,1表示取该位置的数,0表示不取,那么这个0~7的二进制序列则就是完全列举了这3个数字的所有组合。
  • 好了现在我们知道二进制序列可以直接表示几个数的所有组合,那么现在讨论如何通过位运算来进行取值,我们通过外层循环枚举所有的二进制序列,而内层循环通过(1<<j)&i(表示当前外层循环的序列)来表示j为能不能取,如果能取则表示i序列中的第j+1位为1,具体例子,比如上述提到的011用该公式表示的就是j=0和j=1时能取,这同样也是对应了一个组合,对应取数组中的nums[0]和nums[1]。通过不断这样枚举所有的二进制序列来告诉机器此次该取nums哪个位置的元素,这样就枚举出了nums数组的所有取值组合。

解题代码

可以考虑通过x&(x-1)通过每次对1进行消耗来优化一下效率。

#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
int T;
cin>>n;
int nums[n];
for (int i = 0; i < n; i++)cin>>nums[i];
cin>>T;
//用1左移n,用于方便表示长度为n的数组的二进制序列表,比如1<<3=1000,而长度为3的数组需要从001到111
int max = 1<<n;
int count = 0;
for(int i=1;i<max;i++){
    int x = i;
    int sum = 0;
    //计算所选取组合的sum
    for (int j = 0; j < n; j++){
        //一旦x为0,则1取完
        if(x==0)
            break;
        if(x&(1<<j)){
            sum += nums[j];
            //每次消耗一个1
            x = x&(x-1);
        }
    }//若sum和为目标值T则输出
   if(sum==T){
       int t = i;
       for(int j = 0; j < n; j++){
           if(t==0)
            break;
        if(t&(1<<j)){
            cout<<nums[j]<<" ";
            //每次消耗一个1
            t = t&(t-1);
       } 
   }
    count++;
    cout<<endl;
}
}
cout<<count;
return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

位运算骚操作---利用位运算求组合数 的相关文章

  • gcc编译时报错 fatal error: stdio.h: 没有那个文件 解决方法

    在linxu系统中 xff0c 编写c语言程序我们需要使用到GCC编译器 但是当我们成功安装后使用的时候 xff0c 编译程序 xff0c 例如执行编译命令 xff1a gcc hello c o hello out 结果报错了 xff0c
  • Aug.2019_Memory

    转眼间这半个月的时光已经过去了 xff0c 现在就像妈说的 xff0c 生活又要回归正常了 尽管我一直不愿意去承认说前半个月的时光是一种不正常的生活 xff0c 但有一点是我无法否认的 xff0c 那就是那些人和那些事所带给我的 想想最初自
  • 浅析大数据与经济学

    浅析大数据与经济学 摘 要 文章从大数据的发展现状分析入手 讨论了大数据对传统经济学带来的机遇与挑战 运用大数据经济学的概念 xff0c 分析了大数据经济学与信息经济学 信息技术等相关学科的关系 并将理论研究与实践应用实时地统一在一起 最后
  • 数据结构_队列应用-医院挂号看病(C语言)

    通过简单的实现医院挂号看病功能 xff0c 实现对数据结构队列的简单应用 本设计中医院挂号看病主要有病人挂号 查看就诊队列 就诊 下班等功能 span class token macro property span class token
  • Win10系统安装教程

    Win10安装教程 准备 xff1a 一个不小于8G的U盘 xff0c 一台可以上网的电脑 第一步 xff0c 打开浏览器 xff0c 搜索 Win10下载 找到微软官方的下载网址 xff0c 我这里有两个 xff0c 一个中文页面一个英文
  • 本地连接服务器mysql非常慢

    出现问题 经常使用navicat等软件连接服务器的mysql数据库很长时间 xff0c 才能连接上 xff0c 在项目中 xff0c 进行数据库操作 xff0c 也会很慢 原因分析 默认情况下 xff0c mysql会自动开启DNS反向解析
  • uniapp实现微信登录

    项目描述 使用uniapp框架编写微信小程序 xff0c 使用自己的后端 xff0c 实现微信登陆功能 登录流程 此处参考微信官网提供的 小程序登录流程时序 如下图 xff1a 图片来源 xff1a 微信官方API文档 所以登录的流程即 x
  • 程序设计大赛试题及答案

    Problem A 比赛须知 Description 小邯来参加邯郸学院大学生程序设计竞赛 由于这场比赛在线上举行 xff0c 有很多需要遵守的规则 有一条规则是 xff0c 为了避免对题目内容相关的提问被无关的提问淹没 xff0c 所有和
  • 使用uni-app框架中uni.chooseAddress()接口,获取不到用户收货地址

    错误描述 在我们使用uni app框架或微信原生开发微信小程序时 使用到uni chooseAddress OBJECT 接口获取用户收货地址时 无法跳转到收货地址页面获取 打印接口返回信息 显示 chooseAddress fail th
  • 软件工程-部分测试概念

    1 黑盒测试法 黑盒测试法也称功能测试 xff0c 这种方法将被测程序看成一个黑盒子 xff0c 测试人员完全不考虑程序的内部结构和处理过程 也就是说 xff0c 黑盒测试是在程序接口进行的测试 xff0c 它只检查程序功能是否按照需求规格
  • linux下安装libpcap

    1 安装GCC xff1a yum y install gcc c 43 43 2 安装flex xff1a yum y install flex 没有flex xff0c 直接安装libpcap会提示 34 Your operating
  • Spring练习题

    作业 简答题 Spring 是什么 xff1f 谈谈你对IOC的理解简述Spring IOC的启动过程说出bean工厂创建bean的三种方式 xff1f 在Spring中 xff0c bean的注入有几种方式 xff0c 各是什么 xff1
  • CentOS 7 安装XAMPP

    以下步骤如果包含Linux命令 xff0c 没有特别说明均在root下运行 1 首先安装CentOS xff0c 下载ISO的网址如下 xff0c 挑选最快的镜像站点下载 xff1a http isoredirect centos org
  • 实验二 使用CSS样式美化购物列表页面中的菜单导航以及商品展示

    一 实验目的 掌握CSS定义文字 背景图片 超链接控制 列表等常用属性的设置 二 实验要求 在购物列表页面中 xff0c 通过 lt ul gt 标签来实现菜单导航栏 xff0c 然后使用css样式控制菜单栏的位置和样式 xff0c 效果如
  • SpringBoot+Vue项目准妈妈孕期交流平台

    文末获取源码 开发语言 xff1a Java 开发工具 IDEA Eclipse 数据库 MYSQL5 7 使用框架 springboot 43 vue JDK版本 xff1a jdk1 8 前言介绍 系统实现管理员 xff1a 首页 个人
  • SpringBoot+Vue项目社区团购系统

    文末获取源码 开发语言 xff1a Java 框架 xff1a springboot JDK版本 xff1a JDK1 8 服务器 xff1a tomcat7 数据库 xff1a mysql 5 7 8 0 数据库工具 xff1a Navi
  • SSM+Vue+Element-UI实现员工工资管理系统

    文末获取源码 开发语言 xff1a Java 框架 xff1a ssm JDK版本 xff1a JDK1 8 服务器 xff1a tomcat7 数据库 xff1a mysql 5 7 8 0 数据库工具 xff1a Navicat11 开
  • 【Android Studio】使用Binding代替R.layout.xxx显示kotlin.UninitializedPropertyAccessException(已解决)

    初始代码 xff1a span class token keyword class span span class token class name MainActivity span span class token operator s
  • vim编辑器重要快捷键及vim设置

    一 快捷键 1 全选 xff1a ggVG 2 跳转到文本最后一行 xff1a shift 43 g 3 跳转到文本第一行 xff1a gg 4 跳转到光标所选行的行首位置 xff1a 0 5 跳转到光标所选行的行尾位置 xff1a shi
  • 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系

    使用 sudo apt get install 安装软件时 xff0c 出现错误 无法修正错误 xff0c 因为您要求某些软件包保持现状 xff0c 就是它们破坏了软件包间的依赖关系 错误的主要原因是 xff0c 系统中已经安装了被依赖的包

随机推荐

  • import _ssl # if we can‘t import it, let the error propagate

    转载链接 xff1a https blog csdn net u013398960 article details 107524068 实测有用
  • vscode 终端美化

    1 进入网站 Base16 Terminal Colors for Visual Studio Code 2 选择自己喜欢的主题 点击Copy to clipboard 3 打开vscode 设置 输入setting 在 settings
  • vue项目,如何关闭eslint检测?多种解决办法

    点击下方查看博主 博主
  • 关键字 'with' 附近有语法错误。

    最近我在开发中遇到个挺棘手的问题 xff0c 一段T SQL语句在开发环境中明明跑得好好的 xff0c 发布到生产环境却报错 经过排查 xff0c 只有WinXP下才会出现 xff0c 即使是在干净的虚拟机环境中 客户端不管是用C 还是De
  • 通过Gitee绑定域名到CSDN

    目录 申请gitee账号 新建仓库 新建index html文件 设置Gitee Pages 使用CSDN发布博客文章 xff0c 如果别浏览我的文章 xff0c 直接给别人我自己的CSDN链接太长 xff0c 而且也没人能记得住 xff0
  • 一篇关于利用numba加速python运行效率的笔记

    一篇关于加速python代码运行效率的笔记 一 原始代码 部分 分析二 变量预分配内存实现加速三 numba装饰器实现加速3 1 为什么numba可以对python代码加速 xff1f 3 2 修改代码匹配numba的类型支持 四 其它尝试
  • spring框架的知识点总结

    文章目录 什么是Spring框架 什么是Spring 作用 如何在快速添加Maven依赖 SpringFramework 5 x核心之IOC容器什么是IOC 案例 SpringFramework 5 x核心之DI依赖注入什么是DI 案例 S
  • Qt导入Opencv出现undefined reference to cv::xxx

    Qt配置Opencv在Qt运行时报错undefined reference to cv xxx Face Recognizer报错 FaceRecognizer load const char 41 报错 首先 xff0c 如果出现cv x
  • 我是歌手Java实现

    span class token comment AbstractSinger java span span class token keyword package span span class token namespace cn sp
  • 局域网内开FTP服务器共享或传输文件

    开启FTP服务教程 xff08 以Windows10为例 xff09 步骤一 xff1a 关闭防火墙 设置 网络和Internet 以太网 点击网络和共享中心 Windows Defender防火墙 允许应用或功能通过Windows Def
  • 计算机二级C语言软件VC++2010的使用步骤

    本文仅限参加计算机二级C语言考试的同学 xff0c 一般不使用这个软件的 xff0c 看一下 xff0c 避免考试时第一次用到乱了阵脚 在计算机二级考试时 xff0c 直接找到并双击题目中要求的文件即可自动打开软件的界面 考试中打开哪个文件
  • 交叉编译概念及交叉编译工具链的安装

    1 交叉编译是什么 xff0c 为什么要交叉编译 是什么 xff1f 交叉编译 xff1a 是在一个平台上生成另一个平台上的可执行代码 我们在windows上面编写C51代码 xff0c 并编译成可执行代码 xff0c 如xx hex 是在
  • 完成一个SpringBoot项目——员工管理系统

    SpringBoot项目 员工管理系统 该系统为一个springboot项目 员工管理系统的代码 xff0c 前端使用的模板是thymeleaf xff0c 数据写在了dao层 xff0c 没有用数据库 xff0c 完全可以实现增删改查 目
  • 通信术语及综合题

    ITU xff1a International Telecommunication Union国际电信联盟 xff0c 联合国的一个重要专门机构 xff0c 也是联合国机构中历史最长的一个国际组织 简称 国际电联 电联 或 ITU IMT
  • VS2013的Visual C++ 项目如何修改目标框架和平台工具集

    https msdn microsoft com zh cn library ff770576 aspx 如何 xff1a 修改目标框架和平台工具集 Visual Studio 2013 其他版本 可以更改 Visual C 43 43 项
  • Java类继承中的静态块与构造

    span class hljs comment 创建一个父类 span span class hljs class span class hljs keyword class span span class hljs title Super
  • node(express脚手架)+html(jquery模板)

    上代码 html部分 span class token operator lt span span class token operator span span class token constant DOCTYPE span html
  • Ubuntu 使用技巧备忘

    Ubuntu 使用技巧备忘 xff08 持续更新 xff09 小白向 xff0c 备忘 xff0c Ubuntu 20 04版本 Ubuntu 使用技巧备忘 xff08 持续更新 xff09 Ubuntu 使用技巧备忘 xff08 持续更新
  • c语言阶乘的累加和

    c语言 阶乘的累加和 题目描述 求1 43 2 43 n 输入 输入一个整数n xff0c 你可以假定n不大于10 输出 输出一个整数 xff0c 即阶乘累加的结果 xff0c 单独占一行 样例输入 4 样例输出 33 代码如下 span
  • 位运算骚操作---利用位运算求组合数

    文章目录 一道利用组合求和的例题位运算如何实现组合的呢 xff1f 解题代码 一道利用组合求和的例题 这道题乍一看就是把所有的组合给列举出来 xff0c 然后求和看是否等于目标值 xff0c 输出需要注意的是优先输出靠前的下标元素 xff0