关于组合 C(N, K) = C(N - 1, K) + C(N - 1, K - 1) 的理解

组合的递推公式 C(N, K) = C(N - 1, K) + C(N - 1, K - 1) 等价于 C(N + 1, K + 1) = C(N, K + 1) + C(N, K) ,即K和N分别加1。

通过观察 C(N + 1, K + 1) = C(N, K + 1) + C(N, K)

右边第二项C(N, K)为“在N件中取K件的组合数”,左边一项C(N + 1, K + 1)为“在N+1件中取K+1件的组合数”,这两项的差C(N, K + 1)为“在N件中取K+1件的组合数”。

思路是把问题“从N件中取K件”变为“从N+1件中取K+1件”时发生的变化,当从前者变为后者,即向前者总件数N中多投入1件,并且多取出1件,这样问题可以划分为一下两部分:(可以有其他的划分?)

  1. 多取出的那件就是新投入的那件。即在N+1件中取K+1件,而其中的1件已经提前确定好(同时消耗了1个总件数和1次取的机会),问题转化为在N件中取K件,即 C(N, K) 。
  2. 多取出的那件不是新投入的那件。即在N+1件中取K+1件,而其中的1件是不能取的,实际只有N种选择(消耗了1个总件数,但不消耗取的机会),问题转化为在N件中取K+1件,即 C(N, K+1) 。

在做这样的划分的时候要保证划分是“完全”的。

(有点像全概率公式的划分?左边为相同的目的(在N+1件中取K+1件),右边是划分亦即限制条件)

原文地址:https://www.cnblogs.com/CCCat/p/8372388.html

时间: 2024-11-02 01:37:26

关于组合 C(N, K) = C(N - 1, K) + C(N - 1, K - 1) 的理解的相关文章

给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。

题目描述: 给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除. 输入: 两个整数n(2<=n<=1000),a(2<=a<=1000) 输出: 一个整数. 样例输入: 6 10 样例输出: 1 这个题首先如果数字小的话是可以考虑轮流试的,但是1000的数字范围无论是对阶乘还是幂都太大了.于是我们想一下,既然要求整除,说明每个素因子都是可以抵消的,这样我们就可以求解了.但是还要考虑到,因为后面是求哪个k,所以说我们不是对n!和a的幂分别求出对应的素数因子数组.我

C(n,k)在n个不重复数中获得k个数

//比如在数组a[]={1,7,89,87} 中k=2的时候 组合为 C(4,2)=6 package 再次开始; import java.util.ArrayList; //本次实现的是在n个不重复树中提取k个:输出各种组合 //在 1 2 3 7 8 public class 组合问题 { public static void main(String args[]) { int arr[]=new int[]{1,3,4,6,9};// ArrayList<Integer> arry=ne

C#下如何用NPlot绘制期货股票K线图(2):读取数据文件让K线图自动更新

[内容介绍]上一篇介绍了K线图的基本绘制方法,但很不完善,本篇增加了它直接读取数据的功能,这对于金融市场的数据量大且又需要动态刷新功能的实现很重要. [实现方法] 1.需要一个数据文件,这里用的是直接读取由另一个CTP程序从上期交易所接收的期货合约RB1609所写的行情文件日线数据rb1609_d1.txt 文件格式如下: 日期 时间 开盘 最高 最低 收盘 成交量 持仓量 20160810 0.100000 2555.00 2606.00 2540.00 2563.00 3114 6858 2

二叉树(8)----求二叉树第K层的节点数和二叉树第K层的叶子节点数,递归方式

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.求二叉树第K层的节点数 (1)递归方式 给定根节点pRoot: 如

第K大 [ACdream 1099] 瑶瑶的第K大

瑶瑶的第K大 Time Limit: 10000/5000MS (Java/Others)Memory Limit: 512000/256000KB (Java/Others) SubmitStatisticNext Problem Problem Description 一天,萌萌的妹子--瑶瑶(tsyao)很无聊,就来找你玩.可是你们都不知道玩什么...尴尬了一阵子,机智的瑶瑶就提议:“这样吧,你说N个整数xi,然后在随意说一个数字k,我能够快速地说出这些数字里面第 k 大的数字.” Inp

[Swift]LeetCode713. 乘积小于K的子数组 | Subarray Product Less Than K

Your are given an array of positive integers nums. Count and print the number of (contiguous) subarrays where the product of all the elements in the subarray is less than k. Example 1: Input: nums = [10, 5, 2, 6], k = 100 Output: 8 Explanation: The 8

对于近似有序序列(即除掉少数K个元素后是有序序列且K&lt;&lt;n),试分析直接插入排序,冒牌排序和简单选择排序的时间复杂度

学弟问的一道数据结构的题,关于一些排序算法的时间复杂度. 针对近似有序序列, ①当使用直接插入排序时,其基本操作为数组中元素的移动.最好情况下,待排序列有序,无需移动,此时时间复杂度为O(n), 当为近似有序序列是,其基本操作执行的次数是K次当前循环的最大值的和,即时间复杂度为O(k.n)由于k远小于n, 综合考虑直接插入排序的时间复杂度为O(n) ②当使用冒泡排序时,默认为普通冒泡排序,其基本操作为元素间比较的次数,因此无论 是否是近似有序,时间复杂度均为O(n^2) ③当使用简单排序时,其基

给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数。

题目:给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数. 解题思路: 首先取得数组a的中位数a[aMid],然后在b中二分查找a[aMid],得到b[bMid],b[bSt]到b[bMid]的数小于等于a[aMid],b[bMid+1]到b[bEd]大于等于a[aMid],这样数组a和数组b就被划分为了两个部分,第一个部分的数小于等于a[aMid],第二部分的数大于等于a[aMid],然后统计这两个区域数的个数,个数相加等于k就返回,否则重复二分查找.代码如下: def

简单组合java.util.Map&lt;K,V&gt;实现Map&lt;K,P,V&gt;

java.util.Map<K,V>为单键对单值,有时需要双键对单值,因此基于Map<K,V>可以简单实现一个Map<K,P,V>. 接口定义:下载 Java代码 package cc.lixiaohui.demo.javassist.proxy.util; import java.util.Collection; import java.util.Set; /** * 两个键的复合map * <pre> * key------+ *          |-