zoukankan      html  css  js  c++  java
  • 一些简单的排列组合问题

    排列及计算公式
    从n个不同元素中,任取m(m≤n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号
      
    A(n,m)表示或
     
    【P(n,m)】表示。
    A(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)!(当n=m时,上述式子分母为0!=1).
    组合及计算公式
    从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数.用符号
    C(n,m) 表示。(C即Combination).
    C(n,m)=A(n,m)/m!=n!/((n-m)!*m!);C(n,m)=C(n,n-m);            ----摘自百度百科

    例1:传送门

    例2:将n个相同的球放到m个不同的袋子里有几种方案?

    分析:假设m=3,n=2,我们可以这么放(*代表求,空白区域代表袋子): *|  |*,还可以这么放: |**| ,还可以这么放:| |**......这样的话就有m-1个隔板(|)和n个球需要放置在n+m-1个位置中,考虑放置隔板的方案数为C(n+m-1,m-1),考虑求的方案数为C(n+m-1,n),那么答案为C(n+m-1,m-1) = C(n+m-1,n).

    例3:将n个不同的球放到m个不同的袋子里有几种方案?

    分析:第一个袋子可以放n种球,第二个袋子可以放n-1种球......第m个袋子可以放n-m种球,答案为n*(n-1)*...*(n-m).这样分析有点麻烦,因为每一种球都是不一样的,每一种球都只能放进1个袋子里,而每一种袋子则不一样,可以装下n种球。所以我们对球进行分析:第一个球可以放m个袋子里,第二个球可以放m个袋子里,...,第n个球可以放m个袋子里,答案为m^n.

    例4:将n个不同的球放到m个相同的袋子里有几种方案?

    分析:袋子相同就没办法用数学公式推导了,考虑dp.令f[i][j]表示前i个球放在j个袋子里的方案数。考虑第i个球怎么放,如果第i个球占用了一个新的袋子,那么f[i][j] += f[i-1][j-1]就好了。如果没有呢?那么这个球就能放到j个袋子里,即f[i][j] += f[i-1][j] * j,合并一下f[i][j] = f[i-1][j-1] + f[i-1][j] * j.答案是f[n][1] + f[n][2] + ...+ f[n][m]

    例5:将n个相同的球放到m个相同的袋子里有几种方案?

    分析:球相同,袋子也相同,这要怎么计数啊QAQ,要既不多也不少的计数,肯定是有某一种顺序,我们按照每个袋子装球的数量降序排列,这就相当于把相同的袋子强行当成了不同的袋子,为了维护这个降序,我们一旦在第i个袋子放一个球,那么前面的袋子都必须要放一个球,当然,我们也可以考虑不在这个位置多放一个球,我们在后面的袋子放,所以f[i][j] = f[i-j][j] + f[i][j-1].这道题和上一道题有一个很大的区别,上一道题的状态转移方程没有考虑不放的情况,是因为袋子是相同的,放在这个袋子和那个袋子是没有区别的,我们硬性规定第i个球必须放在我们选定的j个袋子中,而这一题虽然题面上说袋子相同,但是我们硬性规定是不同的,所以可以考虑不放的情况。

    总结:这四道题可以得出一个规律:袋子不同用数学,袋子相同用dp,不同和相同的区别在于,不同的话我们可以单独考虑第i个,相同的话必须要变成“不同”的才能单独考虑!

  • 相关阅读:
    云计算、大数据和人工智能简单概述
    Linux 文件管理命令语法、参数、实例全汇总(一)
    C#之继承
    类和结构(二)
    类和结构(一)
    C#基础语法(二)
    C#基础语法(一)
    dotnet体系结构
    九卷读书:刘润商学院学习笔记1
    Linux内存管理
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7289869.html
Copyright © 2011-2022 走看看