- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
从n个数中取m个数的所有组合
本算法用于实现从一个含有n个数字的数组中,任意取其中m个元素的所有组合的实现情况,推导理由:以1,2,3,4,5数组为例,很明显,当只取一个元素时有5种,即单独的一个元素;取2个时候,就是C(5,2)=10种,即任意取2个数,以此类推。
下面给出算法实现:1,单独存入一个元素,并存到所有组合中去;
2,每加入一个新元素,则该新元素为一个单独的组合,同时,该新元素与(前面的)所有组合都可以组成一个新组合。即一步一步地每个加1。例如当前面的所有组合只有(1)时,存入一个2,则2单独存一下;然后2与1组成一个新组合,所有插入2以后,新的所有组合就是:(1),(2),(1,2);接下来插入新元素3,则元素3也可以单独成为一个组合存入,同时元素3还可以与前面的任意一个组成一个新组合,则插入3以后,新的所有组合为:(1),(2),(3),(1,3),(2,3)(1,2,3),以此类推。
3.最后统计(排序)所有组合的个数,以及每一种组合中元素的个数。对应输出元素个数为m的组合即可。
下面给出示例程序:
/*vectorvectorint*/ void My_zuhe(int n,int r)
{
multimapint,vectorint mm,mm2;
vectorint nn,temp,bb;
vectorvectorint target;
multimapint,vectorint::iterator pos;
vectorint::iterator ita,ita_bb;
typedef pairint,vectorint pr;
for(int i=1;i=n;i++)
bb.push_back(i);
if(rn)
return;
int m=1,k;
ita_bb=bb.begin();
temp.push_back(*ita_bb);
mm.insert(pr(temp.size(),temp));
temp.clear();
++ita_bb;
while(ita_bb != bb.end())
{
k=*ita_bb;
for(pos=mm.begin();pos!=mm.end();++pos)
{
temp=pos-second;
temp.push_back(k);
mm2.insert(pr(temp.size(),temp));
temp.clear();
}
for(pos=mm2.begin();pos!=mm2.end();++pos)
mm.insert(*pos);
mm2.clear();
temp.push_back(k);
mm.insert(pr(temp.size(),temp));
temp.clear();
++ita_bb;
}
for(pos=mm.begin();pos != mm.end();++pos)
{
if(pos-first == r)
{
target.push_back(pos-second);
}
}
sort(target.begin(),target.end());
vectorvectorint::iterator tt_pos;
coutIn all we have target.size() kinds, and they are:endl;
for(tt_pos=target.begin(),k=0;tt_pos != target.end();++tt_pos,k++)
{
if(k%5==0 k0)
coutendl;
cout(;
for(ita=tt_pos-begin();ita != tt_pos-end();++ita)
cout*ita, ;
cout) ;
}
//return target;
}
主函数调用为:
#include stdafx.h
#include example23_apply_offer.h
void main()
{
My_zuhe(10,2);
coutendl;
}
实验结果展示:
C(10,2)
C(5,3)
C(5,4)
例题2:
题目描述
给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:1,3,4,9,10,12,13,…(该序列实际上就是:3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2,…)请你求
文档评论(0)