`
nihaokid
  • 浏览: 10116 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

排列与组合

阅读更多

先是一个递归的排列,顺便复习以下bitset的用法

//递归,保存当前状态的

#include <bitset>
#include <stdio.h>
using namespace std;

const int NUM = 6;
bitset<NUM> flag;
char data[NUM];
int order[NUM];

void printPermut(int no);

int main()
{	
	for(int i=0 ; i<NUM ; i++ )
	{
		data[i] = char('a'+i);
	}
	
	flag.set();
	printPermut(NUM);
	
}

void print()
{
	for(int i=0 ; i<NUM ; i++ )
	{
		printf("%c",data[order[i]]);
	}
	printf("\n");
}

void printPermut(int no)
{
	for(int i = 0;i<NUM ;i++)
	{
		if(flag.test(i))
		{	
			order[NUM-no] = i;
			flag.flip(i);
			printPermut(no-1);
			flag.flip(i);
		}
	}
	if(no == 1)
		print();
}

  回一下bitset的方法

bitset例子

#include "stdafx.h"
#include <iostream>
#include <bitset>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    bitset<32> bitvec(8);
	bool flag = bitvec.any();//判断是否存在某位或者多位为1,有则返回true
	bool flag1 = bitvec.none();//判断是否所有的位都是0,是则返回true
	bool flag2 = bitvec.test(3);//测试第4位是否为1,是则返回true
	cout<<"第4位为:"<<bitvec[3]<<endl;//输出第4位的值
	bitvec.reset(3);//将第4位设置为0,或者bitvec[3] = 0
	cout<<"第4位为:"<<bitvec[3]<<endl;//输出第4位的值
	bitvec.reset();//将所有位设置为0
	cout<<"bitvec的值为:"<<bitvec.to_string()<<endl;
	bitvec.set();//将所有位设置为1
	cout<<"bitvec的值为:"<<bitvec.to_string()<<endl;
	bitvec = 8;
	cout<<"bitvec的值为:"<<bitvec.to_string()<<endl;
	bitvec.flip();//将所有的位翻转
	cout<<"bitvec的值为:"<<bitvec.to_string()<<endl;
	bitvec.flip(0);//翻转第一位
	cout<<"bitvec的值为:"<<bitvec.to_string()<<endl;
	bitvec = 0xffff;//设置低16位为1
	cout<<"bitvec的值为:"<<bitvec.to_string()<<endl;
	bitvec = 012;//用八进制值012设置bitvec
	cout<<"bitvec的值为:"<<bitvec.to_string()<<endl;
	string bit = "1011";
	bitset<32> bitvec1(bit);//用字符串对象初始化bitset<32>对象
	cout<<"bitvec1的值为:"<<bitvec1.to_string()<<endl;
	string bit1 = "1111110101100011010101";
	bitset<32> bitvec2(bit1,6);//用 从第6位开始到字符串结束 这一部分 初始化bitvec2 
	cout<<"bitvec2的值为:"<<bitvec2.to_string()<<endl;
	bitset<32> bitvec3(bit1,6,4);//用 从第6位开始,长度为4 这一部分 初始化bitvec3;
	cout<<"bitvec3的值为:"<<bitvec3.to_string()<<endl;
}
 

  下面是一个非递归的算法,和上面的本来就不一样,因为上面的那种方法一开始没写出来非递归的。。。

交换的方法

#include <stdio.h> 
#include <stdlib.h> 
//排列与组合的非递归算法,排列是交换,组合是选择
//从n个元素的数组a中,取m个元素的组合
bool zuhe(int a[],int n,int m) 
{
	//p[x]=y 取到的第x个元素,是a中的第y个元素
    int index,i,*p; 
    p=(int*)malloc(sizeof(int)*m);
    if(p==NULL)
        return false;
	
    index=0;
    p[index]=0;//取第一个元素
    while(true)
    { 
        if(p[index]>=n)
        {//取到底了,回退
            if(index==0) 
            {//各种情况取完了,不能再回退了
                break;
            }
            index--;//回退到前一个
            p[index]++;//替换元素
        } 
        else if(index==m-1) 
        {//取够了,输出
            for(i=0;i<m;i++) 
            {
                printf("%d,",a[p[i]]); 
            }
            printf("\n"); 
            p[index]++; //替换元素
        } 
        else 	
        {//多取一个元素
            index++; 
            p[index]=p[index-1]+1; 
        } 
    }
    free(p);
    return true;
}



//对n个元素的数组a,进行全排列
bool pailie(char a[],int n)
{//p[x]=y 取到的第x个元素,是a中的第y个元素
    int i,j,temp,*p; 
    p=(int*)malloc(sizeof(int)*n);
    if(p==NULL)	
    {	
        return false;
    }
    for(i=0;i<n;i++)	
    {//初始排列	
        p[i]=i;	
    }
    while(true)
    {//循环m=n!次
        //输出一种排列情况
        for(i=0;i<n;i++) 	
        {
            printf("%c",a[p[i]]); 
        }
        printf("\n");     
        //从后向前查找,看有没有后面的数大于前面的数的情况,若有则停在后一个数的位置。
        for(i=n-1;i>0 && p[i]<p[i-1];i--);    
        //若没有后面的数大于前面的数的情况,说明已经到了最后一个排列,返回
        if(i==0) break;
        //从后查到i,查找大于p[i - 1]的最小的数,记入j
        for(j=n-1;j>i && p[j]<p[i-1];j--);
        //交换p[i-1]和p[j]
        temp=p[i-1];p[i-1]=p[j];p[j]=temp;
        //倒置p[i]到p[n-1]
        for(i=i,j=n-1;i<j;i++,j--)	
        {//交换p[c]和p[d] 
            temp=p[i];p[i]=p[j];p[j]=temp;
        } 
    }
    free(p);
    return true;
}


int main() 

{ 
    int a[]={1,2,3,4,5};
	char data[] = {'a','b','c','d','e','f'};
	zuhe(a,5,3);
    pailie(data,4);//排列
    return 0;	
}
 

 

分享到:
评论

相关推荐

    高中数学排列与组合PPT课件.pptx

    高中数学排列与组合知识点 ...3. 组合与排列有联系吗? 结论 排列和组合是高中数学中两个重要的概念,它们之间有着密切的联系,但又有着很大的不同。理解和掌握排列和组合的概念对数学学习非常重要。

    数学排列与组合PPT课件.pptx

    思考三:组合与排列有联系吗?回答:是的,组合是选择的结果,排列是选择后再排序的结果。 判断下列问题是组合问题还是排列问题: 1. 设集合A={a,b,c,d,e},则集合A的含有3个元素的子集有多少个?(组合问题) 2. ...

    高中数学选修排列与组合排列与排列数PPT课件.pptx

    排列与组合 排列是高中数学选修中的一项重要内容,通过本课件的学习,学生可以了解排列的定义、掌握排列数公式及推导方法,并能用“树形图”写出一个排列问题的所有的排列,并能运用排列数公式进行计算。 一、 ...

    高中数学选修 排列与组合 排列与排列数PPT课件.pptx

    排列与组合是高中数学选修中的重要概念,主要涉及如何有序地选取和组织元素。排列是将一组不同的元素按照特定顺序进行排列的方式。在排列问题中,元素的顺序至关重要,因为改变顺序会得到一个不同的排列。 1. 排列...

    排列与组合.doc

    排列与组合是概率论、统计学以及数学竞赛中常见的概念,它们在解决涉及选择和排列问题时起到关键作用。在中学阶段,我们会学习到乘法原理和加法原理,这两个基本原理是理解排列与组合的基础。 乘法原理指出,如果...

    排列与组合课件.ppt

    排列与组合是数学中基础且重要的概念,它们在解决实际问题和理论研究中都有广泛应用。在本课件中,黄玉霞老师通过一系列...此外,通过反思自己的表现,学生可以自我评估对排列组合概念的理解程度,并寻找提升的空间。

    排列与组合同步练习.docx

    13. 数字问题与排列组合的结合:如题目中组成的数字要大于20000且百位不是3,可以通过排除法结合排列组合计算。 14. 比例关系:题目中m:n=13:2,可以通过比例关系解出班级人数。 15. 连接问题:构建道路连接多个点...

    2015高中数学1.2排列与组合教材分析新人教A版选修2_3

    同时,排列与组合与概率知识的结合,为离散型随机变量的分布列学习奠定基础。 教学的重点和难点在于理解排列、组合的基本概念,区分开排列问题和组合问题,掌握排列数、组合数的公式推导及应用,以及排列组合的性质...

    2015高中数学1.2排列与组合课后反思新人教A版选修2_3

    在高中数学的教学中,排列与组合是重要的一环,尤其对于新人教A版选修2-3的课程,这部分内容常常让许多学生感到困难。排列与组合的概念与解题方式有其独特性,不同于传统的数学问题,这使得初次接触的学生需要时间...

    三年级数学广角排列与组合PPT学习教案.pptx

    互学环节鼓励学生之间的互动和合作,通过互相检查对方的结果,发现可能的错误或遗漏,进一步强化对排列组合的理解。小组讨论环节则让学生在团队中分享自己的思考过程,提升表达和倾听的能力。 课程还引入了位值的...

    排列与组合答案.doc

    在提供的文档中,题目涉及了多个排列组合的具体应用,包括抽取不同元素、任务分配、概率计算等。 1. 第一题是关于素数的选择问题,其中涉及到组合的概念。从10个不同的素数中选取两个不同的数,根据组合公式C(n, k)...

    二年级 排列与组合PPT学习教案.pptx

    排列与组合是数学中的基本概念,特别是在概率论和统计学中有着广泛的应用。这个PPT学习教案主要针对二年级的学生,旨在通过实例帮助他们理解这两个概念。排列是有序的组合,而组合则是无序的。在教学过程中,通过...

    高中数学排列与组合59796PPT课件.pptx

    排列与组合是高中数学中的重要概念,主要涉及从一定数量的元素中选择或安排元素的方法。在实际问题中,这两个概念经常被用来解决各种选择和排列的问题。 首先,我们要理解排列和组合的基本定义。排列是从n个不同...

    排列与组合_1.docx

    ### 排列与组合知识点解析 #### 一、教学背景及目标 本次教学内容选自人教版《义务教育课程标准实验教科书数学(二年级上册)》第100页,主要针对二年级学生的认知特点设计。通过具体情境引入,激发学生的学习兴趣...

    一年级数学排列与组合PPT课件.pptx

    一年级数学排列与组合PPT课件.pptx

    高考数学(理)一轮复习讲义 10.2 排列与组合.docx

    排列组合是高中数学中的核心概念,特别是在解决实际问题和应对高考时显得尤为重要。在高考数学(理科)的一轮复习中,深入理解和掌握排列与组合的知识是必不可少的。 首先,我们要明确排列与组合的区别。排列是关于...

    新课标2016高考数学大一轮复习第10章第2节排列与组合课件理

    这需要计算所有可能的组合,考虑到题目具有放回性质,因此需结合排列组合知识进行解答。 总的来说,排列与组合是高中数学中的核心概念,不仅要求学生熟练掌握计算规则,更需要他们具备灵活应用这些规则解决实际问题...

    排列与组合知识点.doc

    排列与组合是组合数学的基本概念,广泛应用于概率论、统计学和计算机科学等领域。这两个概念是计数原理的基础,帮助我们解决如何确定不同选择或排列的数量问题。 **一、两个根本计数原理** 1. **分类加法计数原理*...

Global site tag (gtag.js) - Google Analytics