面试题2:10个靶打中90环的情况有多少种?

中学数学题目:射击训练,每个靶得分为0环到10环(共11种可能),一个人打了10个靶,那么:

打中0环的可能只有一种,即每个靶都打种0环。打中100环情况一样,只不过把得分换为丢分。

打中1环有10种可能,即第1个靶打中1环,其余的靶打中0环;或者第2个靶打中1环,其余的靶打中0环;……或者第10个靶打中1环,其余的靶打中0环。打中99环情况一样,只不过把得分换为丢分。

打中2环有55种可能,分为两类,1) 这2环在同一个靶上,有10种可能;2) 这2环分两个靶打中,每个靶1环,有10*9/2 = 45 种可能。一共有55种可能。打中98环情况一样,只不过把得分换为丢分。

问打中90环的情况有多少种。

思路1:用生成函数。求多项式(x^10 + x^9 + ... + x + 1)^10中x^90那项的系数,为92378。Matlab代码:

a = ones(1, 11);
a2 = conv(a,a);
a4
= conv(a2,a2);
a8
= conv(a4,a4);
a10
= conv(a2,a8);
a10(
91 ) % arrays in Matlabare 1 - based.

ans = 92378

这个办法对所有的环数都成立。

思路2:多重组合。一共在10个靶上丢了10环,考虑把10个相同的小球放到一排10个杯子里边的情况有多少种。10个杯子之间有9个隔板,假设我们有一排19个小坑,选出其中10个小坑放球,另外那9个坑放隔板,那么第1个隔板之前的小球(可能为0个,也可能为10个)放入第1个杯子,第1个和第2个隔板之间的小球(可能为0个,也可能为10个)放入第2个杯子,依此类推,第9个隔板之后的小球放入第10个杯子。那么情况一共有C(10, 19) =92378种。

10个靶中n环的情况数为C(n, 10+n-1),对0<=n<=10成立。

如果10个靶中了11环,按这个公式计算出的答案是167960,这是错误的,因为它把“一个靶中11环”的情况也算了进去,正确的答案是167960-10=167950。

思路3:递推(递归)。适合列举出全部情况。考虑10个靶中3环,对于第1个靶:如果中0环,那问题转为求剩下9个靶里中3环的情况;如果中1环;问题转为求剩下9个靶里中2环的情况;如果中2环;问题转为求剩下9个靶里中1环的情况;如果中3环;问题转为求剩下9个靶里中0环的情况。这样每一步问题规模都在缩小,缩小到只有1个靶时就可以直接给出答案了。

Python 代码:

#-*-coding:cp936-*-

seq
= []
MAX_SCORE
=10

def butt(n,score):
global seq,MAX_SCORE
assert(n>=1andscore>= 0)
ifn==1 :
ifscore<= MAX_SCORE:
seq.append(score)
print seq
seq.pop()
return1
else:#一次得不了这么多分
return 0
else :
cnt
= 0
forsinrange(min(MAX_SCORE,score)+1 ):
#本靶中s环(sin[0,1,2,...]),计算剩下n-1个靶中score-s环的情况
remain_score=score- s;

#剩下n-1个靶全得满分也打不了score-s环,就算了
if(n-1)*MAX_SCORE< remain_score:
continue

seq.append(s)
cnt
+=butt(n-1 ,remain_score)
seq.pop()
return cnt

if__name__=='__main__' :
all
=butt(10,3 )
print"Totalcases:" ,all

这实际上还可以看成一个动态规划问题,如果把中间结果记下来,可以避免很多重复计算。另外如果把MAX_SCORE设为1,那么这个程序可以用来生成所有组合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值