从3个红球,5个白球,6个黑球中任取8个球,其中必须有白球,输出所有可能的方案

如题,代码为 

#include<stdio.h>
int main()
{
	int red,white,black;
	for(red=0;red<4;red++)
	   for(white=1;white<6;white++)
	       for(black=0;black<6;black++)
	          if(red+white+black==8)
	             printf("红球=%d\t白球=%d\t黑球=%d\n",red,white,black);
}

结果如下 

红球=0	白球=3	黑球=5
红球=0	白球=4	黑球=4
红球=0	白球=5	黑球=3
红球=1	白球=2	黑球=5
红球=1	白球=3	黑球=4
红球=1	白球=4	黑球=3
红球=1	白球=5	黑球=2
红球=2	白球=1	黑球=5
红球=2	白球=2	黑球=4
红球=2	白球=3	黑球=3
红球=2	白球=4	黑球=2
红球=2	白球=5	黑球=1
红球=3	白球=1	黑球=4
红球=3	白球=2	黑球=3
红球=3	白球=3	黑球=2
红球=3	白球=4	黑球=1
红球=3	白球=5	黑球=0

 如果“其中必须有白球”这个条件,改为“其中必须有红球”,那么,将for循环里面的red=0改为r=1且white=1改为white=0即可,改成“其中必须有黑球”也同理。

————————————————————————————————

代码中“black<6”的部分确实需要改为“black<7”,多谢评论区朋友的指正。

为我个人的疏忽向各位浏览此文章的朋友致歉。

这道题可以使用组合数学的计数原理来解决,即对红球白球黑球分别计算不放回地取出10个球至少有一个红球的取法数目,然后将它们相乘即可。 对于每一种颜色的球,不放回地取出10个球至少有一个该颜色的球的取法数目可以通过容斥原理计算,即: $$ \text{该颜色球至少一个的取法数目} = \sum_{i=1}^{10}(-1)^{i+1}{{10}\choose{i}}(3-1)^{10-i} $$ 其,$(-1)^{i+1}$ 是容斥原理的符号项,${{10}\choose{i}}$ 是组合数,表示从10个球选出$i$个的取法数目,$(3-1)^{10-i}$ 表示剩余的球的取法数目,即不是该颜色的球的取法数目。 根据乘法原理,三种颜色的球的取法数目相乘即为最终结果。下面是对应的Python代码实现: ```python from math import comb # 输入红球白球黑球的数量 r, w, b = map(int, input().split()) # 计算不放回地取出10个球至少有一个红球的取法数目 at_least_one_red = sum((-1)**(i+1) * comb(10, i) * (3-1)**(10-i) for i in range(1, 11)) # 计算不放回地取出10个球至少有一个白球的取法数目 at_least_one_white = sum((-1)**(i+1) * comb(10, i) * (3-1)**(10-i) for i in range(1, 11)) # 计算不放回地取出10个球至少有一个黑球的取法数目 at_least_one_black = sum((-1)**(i+1) * comb(10, i) * (3-1)**(10-i) for i in range(1, 3)) # 计算最终结果 result = at_least_one_red * at_least_one_white * at_least_one_black # 输出结果 print(result) ``` 对于测试输入 `5 5 2`,预期输出为 `6`;对于测试输入 `3 4 5`,预期输出为 `6`。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值