求个组合数
先把题目列出: 有10个硬币 , 依次投掷排成一排 , 求出现有连续 3 个正面的组合数 。 解题如下: 分析: 10个硬币依次投掷排成一排 , 如果正面记成“1” , 反面记成“0” , 则就是在 10位2进制数中选出出现有连续 3 个(及以上)“1”的二进制数来 。 由于10个 “1”或“0”的位置 , 所以本题的样本空间数为 N = 2^10 = 1024 个 。 可以有 两种方法求出组合数:一是先求出“没有两面的+有1个或只有2个连续”的数值 , 然后用 N 减去所求数值;二是直接求出“有 3 个及 3个以上”的数值 , 因为 有 4 个......有10个连续的也是先得有 3 个连续的才能往上加 。 按照精典组合数的求法 , 不妨将类如 “1111”记为“4”等 , 则有如下连续正面 分类图:A09 90008 080 8000007 0070 0700 700000006 00060 00600 06000 60000000005 000050 000500 005000 050000 5000000000004 0000040 0000400 0004000 0040000 0400000 400000000000003 00000030 00000300 00003000 00030000 00300000 03000000 30000000 其中如 “0000400” , 实际样本是“0000111100” , 即含连续4个正面的情况等等 。 那么其左边的3个“0”和右边的1个“0” , 是可变位 , 可变位可填写“0”或“1” 。 诸如“1110400”或“1010401”或“1110400”等均是其可能的值 , 但“4”的左右 边不能填 , 填了“1”则就不是连续 4 个了 。 那么上面分类中的每个项能容纳多少 个不同的数呢? 为此 , 先设: T(m:k)为 m 个空位 , k (k ≤m) 为最大可填连续填的空位数 , 并令 T(0:0) = 1; 那么对于 “0000400”可表示为“000”+“040”+“0” , 即“040”“左边3空位” 有T(3,3)和“右边1空位” T(1,1) 乘积即为此类可能出现的样本数 。 可以证明 T(4,4) = T(3,3)*T(1,1) , 即 16 = 8 * 2; 而对于“4000000”这样的类型 , 可表示为“40”+“00000” , 其数量是T(5,4) , 因为如果“00000” , 全部出现“1” , 成了“11111” , 是“5 连正”了 , 而不是限 定在“4 连正”了 , 所以限定只能出现最大连续空位值为 4 了 。 为此 , 设: R(n..k)为 n 个空位 , k 为连续 j 个正面“1”个数; 显然 , 当 n = j 时 , 即 R(n, n) = R(j, j) = 1; 如: R(4..4) = 1; R(4..3) = 2;(0111,1110 两种) R(5..4) = 2;(01111,11110两种) R(5..3) = 5;(00111,01110,11100,11101,10111五种) 类似地: R(6..5) = 2; R(6..4) = 5; R(6..3) = 12; 所以也有: T(1:1) = 2^1 = 2 T(2:2) = 2^2 = 4 ...... T(n:n) = 2^n 而如 T(4,3) = T(4,4) - R(4..4) = 2^4 - 1 = 15 T(5:4) = T(5:5) - R(5..5) = 2^5 - 1 = 31; T(5:3) = T(5:5) - R(5..5) - R(5..4) = 2^5 - 1 - 2 = 29 T(6:3) = T(6:6) - R(6..6) - R(6..5) - T(6..4) = 2^6 - 1 - 2 - 5 = 56 设 L(n) 为 n 连正的样本数 , 则分类图可表示如下: L(10)= T(0:0); L(9) = T(0:0) +T(0:0); L(8) = T(1:1) +T(0:0) +T(1:1); L(7) = T(2:2) +T(1:1) +T(1:1) +T(2:2); L(6) = T(3:3) +T(2:2) +T(2:2) +T(2:2) +T(3:3); L(5) = T(4:4) +T(3:3) +T(3:3) +T(3:3) +T(3:3) +T(4:4); L(4) = T(5:4) +T(4:4) +T(4:4) +T(4:4) +T(4:4) +T(4:4) +T(5:4); L(3) = T(6:3)+T(5:3)+T(5:3)+T(5:3)+T(5:3)+T(5:3)+T(5:3)+T(6:3); 即: L(10)= T(0:0) = 1; L(9) = 2 * T(0:0) = 2; L(8) = 2 * T(1:1) + T(0:0) = 5; L(7) = 2 * T(2:2) + 2 * T(1:1) = 2 * 4 + 2 * 2 = 12; L(6) = 2 * T(3:3) + 3 * T(2:2) = 2 * 8 + 3 * 4 = 28; L(5) = 2 * T(4:4) + 4 * T(3:3) = 2 * 16 + 4 * 8 = 64; L(4) = 2 * T(5:4) + 5 * T(4:4) = 2 * 31 + 5 * 16 = 142; L(3) = 2 * T(6:3) + 6 * T(5:3) = 2 * 56 + 6 * 29 = 286; 则: L = L(10) + ... + L(3) = 540; 但上述数值计算中 , 没有考虑“构造样本重复”的可能性 , 所以 L 这个数值需要修正 。 那么构造中的重复性在哪里呢? 先看一下分类图的最后两行:0000004 0000040 0000400 0004000 0040000 0400000 400000000000003 00000030 00000300 00003000 00030000 00300000 03000000 30000000 可以证明 , 出现重复的可能性在于出现 2 个 n 连正上(不可能出现 3 个及以上) 。 如:上一行的“0000004” , 可能与行后面的 “0400000”和“4000000”有重复 , “1111004” , “4001111” , 就是重复了 。 记:L(4) = T(5:4) + T(4:4) + T(4:4) + T(4:4) + T(4:4) + T"(4:4) + T"(5:4);L(3) = T(6:3) + T(5:3) + T(5:3) + T(5:3)+ T"(5:3) + T""(5:3) + T"""(5:3) + T"(6:3); 则: T"(4:4) = T(4:4) - 1 = 16 - 1 = 15; T"(5:4) = T(5:4) - 2 = 31 - 2 = 29; T"(5:3) = T(5:3) - 1 = 29 - 1 = 28; T""(5:3) = T(5:3) - 1 - 2 = 26; T"""(5:3)= T(5:3) - 5 = 24; T"(6:3) = T(6:3) - 12 = 44; L"(4) = T(5:4) + T(4:4) + 2*T(3:3) + T(2:2)*T(2:2) + T(3:3)*2 + T"(4:4) + T"(5:4) = 31 + 16 + 16 + 16 + 16 + 15 + 29 = 31 + 64 + 15 + 29 = 139 L"(3) = T(6:3)+T(5:3)+2*T(4:3)+T(3:3)*T(2:2)+T"(5:3)+T""(5:3)+T"""(5:3)+T"(6:3) = 56 + 29 + 30 + 32 + 28 + 26 + 24 + 44 = 269 L" = L"(3) + L"(4) + L(5)+...+L(10) = 112 + 139 + 269 = 520; 所以连续 3 个正面的组合数为 520 个 。 计算机求个数程序(delphi)如下: var i,m: integer; begin m:= 0; for i:= 0 to 1023 do begin if pos("111", IntToStr(i)) 0 m:= m + 1; end; ShowMessage(IntToStr(m)); end;