如何用C++把从N个数里面取n(n

xk280399649 2011-09-10 06:29:48
RT~
不能用 rand()函数,因为这样子还是有可能会遗漏掉。。
哪位大哥帮帮我~~急用。。。
...全文
2143 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
alcz2008 2011-09-12
  • 打赏
  • 举报
回复
递归。。。
fiveyes 2011-09-11
  • 打赏
  • 举报
回复
18楼的主意很好,STL实现的算法毫无疑问是大师级的水准,问题是next_permutation是用来生成全排列的,而且我也不怕丢人,刚刚看了一会儿next_permutation的教程文章,看得有点儿头晕。

我觉得是这样啊,生成全排列是比较难的问题,因此STL里面有这个了,省得浪费程序员们的脑细胞。而生成组合呢,相对来说就容易多了,所以编写STL的大牛们觉得没有那个必要。

另一个可能就是STL里已经有生成组合的算法,或者使用next_permutation系列算法就能够生成组合?本人水平实在是菜,这个就有待高手解答了。
gnosis 2011-09-11
  • 打赏
  • 举报
回复
直接用next_permutation不就结了?
fiveyes 2011-09-11
  • 打赏
  • 举报
回复
2楼的方法经典!
fiveyes 2011-09-11
  • 打赏
  • 举报
回复
我也根据2楼的方法写了一个,仅供参考。(VS2005及C-Free3.5编译通过)


//求N里取k的全部组合并输出。(k<N)
//算法:建立一数组bits[N],每个元素为0或1,
// 用以模拟一个N位的二进制整数,
// 使其从0增加到11111...(全1即最大值),
// 寻找其中1的个数为k的情况,
// 并输出bits[i]==1对应的元素即可。
#include <stdio.h>
#include <math.h>
#define N 5 //总共有N个元素
#define K 3 //取K个元素

//------------------------------------------------------------------------------
bool HasKOne(int bits[],int k)
//N个元素的数组bit[]中仅含有0或1。
//若bits[]中确有k个1,返回true,否则返回false
{
int total = 0;
for(int i=0;i<N;i++)
if(bits[i]==1)
total++;

return total==k;
}


void BinAddOne(int bits[])
//有N个元素的数组bits[]模拟一个二进制整数,使其加1
{
bool carry = false;//是否有进位
int position = 0; //当前计算到的位置(下标)
do
{
if(bits[position]==1) //若当前位是1
{
bits[position] = 0; //加1后得0
carry = true; //有进位
position++; //高一位加1
}
else //若当前位是0
{
bits[position] = 1; //加1后得1
carry = false;
}
} while (carry);//无进位时运算结束
}

void CombinationOutput(int array[], int k)
//输出有N个元素的序列array中取k个元素的全部组合
{
int bits[N] = {0};//用来模拟N位二进制整数的数组
for(int i=0;i<pow(2.0,N)-1;i++) //共需(2^N)-1次加1
{
BinAddOne(bits);
if(HasKOne(bits, k))
{
for(int j=0;j<N;j++)
{
if(bits[j]==1)
printf("%d ", array[j]);
}
printf("\n");
}
}
}
//--------------------------------------------------------------------------

int main()
{
int array[N];
for(int i=0;i<N;i++)
array[i] = i+1;

CombinationOutput(array, K);
return 0;
}


  • 打赏
  • 举报
回复
注意,以上的include<pause>和最后的pause()去掉,那是我自己写的库文件.因为我用的dev-cpp执行dos窗口一闪而过
  • 打赏
  • 举报
回复
#include<iostream>
#include<pause>

using namespace std;

void combin();

static int count=0;

int main()
{

combin();


pause();
return 0;
}

void combin()
{
extern int count;
int m , n;

cout<<"n="<<endl;
cin>>n;
cout<<"m="<<endl;
cin>>m;
n=(n>m)?n:m;

int *com= new int[n];
int *a=new int[m+1];
int k=m;

for(int i=0;i<=m;i++)
a[i]=i-1;

for(int j=0;j<n;j++)
com[j]=j+1;

for(int j=1;j<=m;j++)
cout<<com[a[j]]<<" ";
cout<<endl;
count++;

while(a[0]==-1)
{

a[k]++;

if(a[k]==n)
{
k--;
continue;
}
if(k<m)
{
k++;
a[k]=a[k-1];
continue;
}
if(k==m)
{
for(int j=1;j<=m;j++)
cout<<com[a[j]]<<" ";
cout<<endl;
count++;
}
}

delete []com;
delete []a;

cout<<"total count: "<<count<<endl;
}
saishow 2011-09-11
  • 打赏
  • 举报
回复
表示没看懂LZ的意思.
mengmingtao 2011-09-11
  • 打赏
  • 举报
回复
试着写了一个~。没有做太多优化,但还是可以看懂的。


#include <iostream>
#include <string>
using namespace std;

void select(int,int,int,int);

int main(){
select(0,5,0,8);
}

void select(int tab_num,int cnt,int i,int j){//输出tab_num个tab键盘,然后
if(i<j){
if(cnt==1){
for(int m=i;m<j;m++){
for(int n=0;n<tab_num;n++)
cout << '\t';
cout << m <<endl;
}
}else{
for(int n=0;n<tab_num;n++)
cout << '\t';
cout << i <<endl;
select(tab_num+1,cnt-1,i+1,j);
select(tab_num,cnt,i+1,j);
}
}
}
AndyZhang 2011-09-10
  • 打赏
  • 举报
回复
就是组合呗,讲所有组合的情况列举出来。
n
C =
N
是这个公式吧
孤独小剑 2011-09-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qq120848369 的回复:]
1bit代表1个数,令整数从0增加,利用常见的判1个数方法确定是否有n个1,是则打印这个集合。
[/Quote]
++
qq120848369 2011-09-10
  • 打赏
  • 举报
回复
1bit代表1个数,令整数从0增加,利用常见的判1个数方法确定是否有n个1,是则打印这个集合。
querdaizhi 2011-09-10
  • 打赏
  • 举报
回复
看不懂题的飘过....
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。进阶篇本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧