[经典算法] 排列组合-N元素集合的M元素子集
题目说明:
假设有个集合拥有n个元素,任意的从集合中取出m个元素,则这m个元素所形成的可能子集有那些?
题目解析:
假设有5个元素的集合,取出3个元素的可能子集如下:
{1 2 3}、{1 2 4 }、{1 2 5}、{1 3 4}、{1 3 5}、{1 4 5}、{2 3 4}、{2 3 5}、{2 4 5}、{3 4 5}
这些子集已经使用字典顺序排列,如此才可以观察出一些规则:
- 如果最右一个元素小于m,则如上面一样的不断加1
- 如果右边一位已至最大值,则加1的位置往左移
- 每次加1的位置往左移后,必须重新调整右边的元素为递减顺序
所以关键点就在于哪一个位置必须进行加1的动作,到底是最右一个位置要加1?还是其它的位置?
在实际撰写程式时,可以使用一个变数positon来记录加1的位置,position的初值设定为n-1,因为我们要使用队列,而最右边的索引值为最大的n-1,在position位置的值若小于m就不断加1,如果等于m了,position就减1,也就是往左移一个位置;由于位置左移后,右边的元素会经过调整,所以我们必须检查最右边的元素是否小于m,如果是,则position调整回n-1,如果不是,则positon维持不变。
程序代码:
#include <gtest/gtest.h>
using namespace std; void ShowResult(int data[], int M)
{
for (int i=0; i<M; i++)
{
cout << data[i] << " ";
}
cout << endl;
} int GenerateMFromN(int N, int M)
{
int nCount = 0;
if (M==0)
{
return 1;
} int* State = new int[M];
for (int i=0; i<M; i++)
{
State[i] = i+1;
} nCount++;
ShowResult(State, M); int nPos = M-1; while (State[0] < N-M+1)
{
if (State[M-1] == N)
{
nPos--;
}
else
{
nPos = M-1;
} State[nPos]++; for (int i = nPos+1; i < M; i++)
{
State[i] = State[i-1] + 1;
} ShowResult(State, M);
nCount++;
} delete [] State; return nCount;
} TEST(Algo, tGenerateMFromN)
{
// 3选0组合 3!/(0!*(3)!) = 1
ASSERT_EQ(GenerateMFromN(3,0), 1); // 5选3组合 5!/(3!*(5-3)!) = 10
ASSERT_EQ(GenerateMFromN(5,3), 10); // 5选5组合 5!/(5!*8!) = 1
ASSERT_EQ(GenerateMFromN(5,5), 1); // 10选2组合 10!/(2!*8!) = 45
ASSERT_EQ(GenerateMFromN(10,2), 45);
}
[经典算法] 排列组合-N元素集合的M元素子集的更多相关文章
- [经典算法] 排列组合-N元素集合的所有子集(一)
题目说明: 给定一组数字或符号,产生所有可能的集合(包括空集合),例如给定1 2 3,则可能的集合为:{}.{1}.{1,2}.{1,2,3}.{1,3}.{2}.{2,3}.{3}. 题目解析: 如 ...
- [经典算法] 排列组合-N元素集合的所有子集(二)
题目说明: 给定一组数字或符号,按照字典序产生所有可能的集合(包括空集合),例如给定1 2 3,则可能的集合为:{}.{1}.{1,2}.{1,2,3}.{1,3}.{2}.{2,3}.{3}. 题目 ...
- python算法-排列组合
排列组合 一.递归 1.自己调用自己 2.找到一个退出的条件 二.全排列:针对给定的一组数据,给出包含所有数据的排列的组合 1:1 1,2:[[1,2],[2,1]] 1,2,3:[[1,2,3],[ ...
- HDU5145:5145 ( NPY and girls ) (莫队算法+排列组合+逆元)
传送门 题意 给出n个数,m次访问,每次询问[L,R]的数有多少种排列 分析 \(n,m<=30000\),我们采用莫队算法,关键在于区间如何\(O(1)\)转移,由排列组合知识得到,如果加入一 ...
- java 删除整数元素集合中的元素
1. 简介 对于整数类型的元素集合,例如{1, 2, 3, 4, 5},再进行元素删除时需要注意.在List中删除操作有remove(int index)和remove(Object o), 查看两种 ...
- 递归算法之排列组合-求一个集合S的m个元素的组合和所有可能的组合情况
求一个集合S的m个元素组合的所有情况,并打印出来,非常适合采用递归的思路进行求解.因为集合的公式,本身就是递归推导的: C(n,m) = C(n-1,m-1) + C(n-1,m). 根据该公式,每次 ...
- 原生JS获取元素集合的子元素宽度
有些时候,在一个网页的ul li中,存在左右两个部分的内容,但是右边元素内容又是不固定,左边元素相对应的不能用固定宽度,所有需要我们动态的获取右边元素宽度,来赋值给左边元素的marginRight值. ...
- 操作jQuery集合搜索父元素
搜索父元素 1.1parents()方法 parents()方法用于获取u当前匹配元素集合中的每个元素的祖先元素,根据需要还可以使用一个选择器进行筛选parents([selector]) 其中sel ...
- PHP的排列组合问题 分别从每一个集合中取出一个元素进行组合,问有多少种组合?
首先说明这是一个数学的排列组合问题C(m,n) = m!/(n!*(m-n)!) 比如:有集合('粉色','红色','蓝色','黑色'),('38码','39码','40码'),('大号','中号') ...
随机推荐
- dbcp 是什么
Many Apache projects support interaction with a relational database. Creating a new connection for e ...
- 网页上的JS call Unity3d里的function——SendMessage
注意: sendmessage只可以从网页发信息到unity游戏里,但是没有返回值 只可以发布三种类型的data,不可以其他复杂的强类型 发信息的时不会做编译检测 SendMessage Workfl ...
- 访问ControlTemplate内部的元素
需要用到code behind 注意要给需要访问的元素命名x:Name="PART_TextBlock" <ResourceDictionary xmlns="ht ...
- 在XAF(ASP.NET)中以ListEditor的形式调用百度地图API
因为项目需要,在系统中使用地图显示设备的地理位置.考虑过ArgGIS,Bing和Baidu地图.本来想用ArgGIS,看教程嫌麻烦.所以还是用Web地图吧.Bing的话还要申请个key,没心情.百度地 ...
- HTML5 ajax上传附件
var fd = new FormData(); fd.append('/*键值*/', this.files[0]);var xhr = new XMLHttpRequest ...
- JOIN 相关内容
1.left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 2.right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 3.inner join ...
- 关于div的居中的问题
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-01-11) div水平和垂直居中,text-align和vertical-align不起作用,因为标签div没有这两个属性, ...
- Car immobilizer hacking
Karsten Nohl <nohl@srlabs.de>
- Cocos2D-x权威指南:通过节点控制屏幕中的全体渲染对象
本节,已经能够利用我们眼下所学的知识做出一些有趣的东西.之前已经说过,CCNode类没有贴图,也就是说在屏幕上单独建立一个节点是没有不论什么效果的,可是能够通过这个"无形"的节点来 ...
- hdu 4859 海岸线 最小割
海岸线 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4859 Description 欢迎来到珠海! 由于土地资源越来越紧张,使得许多海滨城市都只能 ...