给定n个元素集合,求k个元素的组合数目

本文介绍了使用位操作高效求解组合问题的算法,通过一个引例解释了如何找到比给定数字N二进制表示中1的个数相同的最小大数。这个算法的核心是位操作,包括找到最右边连续1的开始、位移动和补位等步骤。最后展示了如何利用这个算法实现从N个对象中选择m个对象的所有组合,并给出了C++实现代码。
摘要由CSDN通过智能技术生成

转载自:http://blog.csdn.net/zdy0_2004/article/details/17006957

本篇摘要

本篇介绍一个非常给力的求组合的算法!上一篇“c_c++刁钻问题各个击破之位运算及其实例(2)”介绍了6个比较复杂的位操作,但是没有给出任何应用实例,本篇就之前谈到的位操作进行应用,其主要内容是用位操作来实现求组合

引例

先来看一道题目,这个题目是理解利用位操作求组合的关键。它是POJ的2453。英文原题就不贴了,我用中文描述一下吧:给定一个正整数N,求最小的、比N大的正整数M,使得M与N的二进制表示中有相同数目的1。

上面的题目描述或许有点拗口,举个例子把,假如给定的N为78,其二进制表示为1001110,包含4个1,那么最小的比N大的并且二进制表示中只包含4个1的数是83,其二进制是1010011,因此83就是答案。那么如何求解这个问题呢?

(2) 非常给力的方法

即将要介绍的方法到底有多给力呢?它神奇到只用如下几行代码(事实上可以合并为一行代码)就能实现上述所有代码的功能,这几行代码是:

[cpp]  view plain  copy
  1. [cpp] view plaincopyprint?  
  2. int NextN(int N)    
  3. {    
  4.     int x = N&(-N);          
  5.     int t = N+x;    
  6.     int ans = t | ((N^t)/x)>>2;    
  7.     return ans;    
  8. }    

 看到了不&

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值