一、常考点
含有相同元素的全排列:例如2个a,3个b,4个c可以组成多少个不同的字符串?9!/2!/3!/4!。
n个人的全排列:排成一排为n!,排成一圈且考虑旋转带来的差异也为n!,排成一圈但不考虑旋转差异则为(n-1)!。
二、普通排列组合练习题
1、X*Y的方格阵中,从左上角走到右下角,每次只能走一格且只能向右走或向下走,有多少种走法
解法:向右一定走Y-1步,向下一定走X-1步,总共要走X+Y-2步,走法有C(X+Y-2,X-1)种。
当n<=10时:
组合数的计算方法一(利用递归公式):
classRobot {
public:     
    intC(intn,intm) {
        if(m == 1)
            returnn;
        if(m == n || m == 0)
            return1;
        returnC(n-1,m-1)+C(n-1,m);
    }
     
    intcountWays(intx, inty) {       
        returnC(x+y-2,x-1);
    }
};

组合数的计算方法二(利用定义):

class  Robot {
public :

    int countWays(int x, int y) {        
        int n1 = 1,n2 = 1;
        for (int i = 1,j = x+y-2;i <= x-1;i++,j--) {
            n1 *= i;
            n2 *= j;
        }
        return n2/n1;
    }
};

3、n个人站队,他们的编号依次从1到n,要求编号为a的人必须在编号为b的人的左边,但不要求一定相邻,请问共有多少种排法?第二问如果要求a必须在b的左边,并且一定要相邻,请问一共有多少种排法?

http://www.matrix67.com/blog/archives/393
解法:
classStandInLine {
public:
    // 计算组合数 
    intC(intn,intm) {
        if(m == 1)
            returnn;
        if(m == n || m == 0)
            return1;
        returnC(n-1,m-1)+C(n-1,m);
    }
    // 计算阶乘
    intA(intn,intm) {
        intres = 1;
        for(inti = n;i > n-m;i--) {
            res *= i;
        }
        returnres;
    }
     
    vector<int> getWays(intn, inta, intb) {
        vector<int> res;
        res.push_back(A(n-2,n-2)*(C(n-1,2)+C(n-1,1)));
        res.push_back(A(n-1,n-1));
        returnres;
    }
};
4、n颗相同的糖果,分给m个人,每人至少一颗,问有多少种分法。
解法:○○|○○○○○|○○○这10颗糖中间有9个空,插两个隔板,分成3分,有C(9,2)种分法。
classDistribution {
public:
    intComb(intn,intm) {
        if(n == 0&& m == 0return1;
        if(m == 1returnn;
        if(m == n || m == 0return1;
        returnComb(n-1,m-1)+Comb(n-1,m);
    }
     
    intgetWays(intn, intm) {
        returnComb(n-1,m-1);
    }
};
三、复杂排列组合练习题
1、卡特兰数
当问题可以表示成以下两种形式时,就是卡特兰数问题。f(n)= C(2*n,n)/(n+1)。
①f(n) = f(0)*f(n-1)+ f(1)*f(n-2)+……+ f(n-2)*f(1)+ f(n-1)*f(0);
②f(n) = C(2*n,n)-C(2*n,n+1)。

2、 n对左右括号,请求出合法的排列有多少个

解法:将左括号记为1,右括号记为-1,则n对左右括号的序列就是1、-1序列,从左到右遍历该序列,并将遍历元素值叠加记为sum,假设遍历到第j个时sum=0说明在j的左边除了与j配对的括号对合法外,已遍历的j/2-1对括号也是合法的括号序列,剩下的(2n-j)/2对括号也是合法的括号序列,则这种情况的组合总数为f(j/2-1)*f(n-j/2),依次类推可知f(n) = f(0)*f(n-1)+ f(1)*f(n-2)+……+f(j/2-1)*f(n-j/2)+……+ f(n-2)*f(1)+ f(n-1)*f(0) = C(2*n,n)/(n+1)。
classParenthesis {
public:
    intComb(intn,intm) {
        if(n == 0return0;
        if(m == 1returnn;
        if(m == n || m == 0return1;
        returnComb(n-1,m-1)+Comb(n-1,m);
    }
     
    intcountLegalWays(intn) {
        returnComb(2*n,n)/(n+1);
    }
};

3、n个数进出栈的顺序有多少种

解法:假设进栈前的序列中第i个数在出栈后的序列中也在第i个位置,则说明前i-1个数完成进栈出栈操作后第i个数才进栈出栈,也就是说问题可描述为f(n) = f(0)*f(n-1)+ f(1)*f(n-2)+……+ f(n-2)*f(1)+ f(n-1)*f(0)。
class Stack {
public:
    int countWays(int n) {
        int c1 = 1,c2 = 1;
        for (int i = 1;i <= n;i++)
            c1 *= i;
        for (int j = n+1;j <= 2*n;j++)
            c2 *= j;
        return c2/(c1*(n+1));
    }
};
4、以下问题均是卡特兰数问题
①2n个人排队买票,n个人拿5块钱,n个人拿10块钱,票价是5块钱1张,每个人买一张票,售票员手里没有零钱,问有多少种排队方法让售票员可以顺利卖票。
②求n个无差别的节点构成的二叉树有多少种不同的结构?
③12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
5、有n个信封,包含n封信,现在把信拿出来,再装回去,要求每封信不能装回它原来的信封,问有多少种装法?
解法:假设第i封信装入第1个信封,则剩下的信和信封有两种情况:①第1封信恰好也装入了第i个信封,问题为f(n-2);②第1封信没有装入第i个信封,问题为f(n-1)。而i有n-1种选择,所以原问题可以表示为f(n)=(n-1)(f(n-1)+f(n-2))。

class  CombineByMistake {
public :

   int countWays(int n) {
        if (n == 1) 
            return 0;
        if (n == 2)
            return 1;
        long f1 = 0,f2 = 1;
        long mod = 1000000007;
        for (int i = 3;i <= n;i++) {            
            long temp = (i-1)*(f1+f2)%mod;
            f1 = f2;
            f2 = temp;
        }        
        return (int)f2;
    }
};

推荐博文:

二叉树相关练习题(C++)
经典排序算法的C++实现
与字符串有关的一些典型问题的C++解法
一些可以用动态规划(DP)算法解决的问题(C++)
与概率相关的算法题C++解法(附证明过程)
二分查找的巧妙运用(C++)
位运算在算法题中的使用(C++)
链表相关练习题(C++)
用实例讲解栈和队列(C++)
一些智力题的C++解法

排列组合相关笔试面试题(C++)相关推荐

  1. python实现不重复排列组合_python之itertools的排列组合相关

    最近由于需要做一些排列组合的需要,本来没想到python自带库中会有这功能,还花了点时间写了下,后来翻看python标准库的时候,发现,这货居然直接提供了,而且还提供了几种形式,之间上代码: impo ...

  2. Leetcode 组合总和 与 排列组合相关问题

    Leetcode 组合总和 与 全排列相关问题 组合总和 题目链接: Leetcode 39.组合总和 题目描述 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 c ...

  3. 排列组合相关公式讲解(Anm,Cnm等)

    两个性质: 1.C(n,m)=C(n,n-m) 2.C(n,m)=C(n-1,m)+C(n-1,m-1):(编程时可用此递推)

  4. 为各位学弟学妹整理的C语言/C++相关笔试面试题

    1 变量的声明和定义有什么区别 变量的定义为变量分配地址和存储空间, 变量的声明不分配地址.一个变量可以在多个地方声明, 但是只在一个地方定义.加入extern 修饰的是变量的声明,说明此变量将在文件 ...

  5. .NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)

    阅读目录 1.KwCombinatorics基本介绍 2.足球彩票排列组合应用 3.排列组合生成代码与测试 今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinator ...

  6. Algorithm:【Algorithm算法进阶之路】之算法中的数学编程相关习题(时间速度、进制转换、排列组合、条件概率、斐波那契数列)

    Algorithm:[Algorithm算法进阶之路]之算法中的数学编程相关习题(时间速度.进制转换.排列组合.条件概率.斐波那契数列) 目录 时间速度 排列组合 进制转换 条件概率 斐波那契数列 时 ...

  7. Java内部类详解(使用场景和好处、相关内部类的笔试面试题)

    此篇文章作者为:Matrix海子 出处:http://www.cnblogs.com/dolphin0520/ 最近也是在学习java,看的是<java核心技术卷一>jdk8,看到内部类的 ...

  8. 【笔试/面试】排列组合与概率计算(二)

    [面试]排列组合与概率计算(一) 基本公式 (1)排列 Amn=n!(n−m)!Anm=n!(n−m)! A_n^m=\frac{n!}{(n-m)!} (2)组合 (nm)=n!m!(n−m)!(n ...

  9. 面试题 08.08. 有重复字符串的排列组合-快速排序+回溯深度优先搜索

    面试题 08.08. 有重复字符串的排列组合+快速排序加回溯深度优先搜索 有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe" 输 ...

最新文章

  1. 农民工上网求职事半功倍
  2. 程序员书单_UML篇
  3. Android manifest属性总结
  4. Cisco PIX Syslog 配置说明
  5. 最长上升子序列(Longest increasing subsequence)
  6. android:scaleType的各个属性解释
  7. 一个家系突变分析一篇 SCI | 文章解析
  8. LCA SP913 QTREE2 - Query on a tree II
  9. 中兴的芯片,到底什么水平?
  10. python按行读取csv文件_python.csv 按行按列读取
  11. SpringMVC对象绑定时自定义名称对应关系
  12. python正则表达式re模块_详解Python正则表达式re模块
  13. IE实现PDF在线预览功能
  14. 基于分段解析法的单自由度反应谱程序
  15. python爬虫课设-爬取3000条数据并做数据可视化
  16. 如何快速定位出一个IP地址的归属地?——二分查找变体
  17. System.Drawing.Printing.InvalidPrinterException: 未安装打印机。
  18. XML第四讲:DTD元素、属性深度详解
  19. insurgency服务器修改,insurgency指令大全 | 手游网游页游攻略大全
  20. PS抠图:将猫咪图片打造成唯美星空效果图

热门文章

  1. STM32 输入捕获 测量频率 PWM占空比
  2. 【通用】Windows Server 2012突然无法复制文件到阿里云服务器
  3. js基础--数据类型
  4. 开发在线文档时,这个技术难点你解决了吗?
  5. 泛型和容器--2--容器
  6. 与计算机和网络有关的英语,网络的英语作文(通用10篇)
  7. 苹果CMS V10自动采集脚本开始执行 版本:v1.0
  8. 建筑智能化资质办理要求
  9. C语言进阶——函数指针
  10. matlab求最大公倍数_matlab求最大公约数和最小公倍数