网上流传的一个华为笔试题

 

题目:射击运动员10发打中90环有多少种可能,请编写程序计算出来,并打印出结果,0环和10环均有效 

答案:92378

1)搜索

 


乱七八糟编程题(1)网上流传的一个华为笔试题_html#include <iostream>

乱七八糟编程题(1)网上流传的一个华为笔试题_htmlusing namespace std;

乱七八糟编程题(1)网上流传的一个华为笔试题_html

乱七八糟编程题(1)网上流传的一个华为笔试题_htmlint Count;

乱七八糟编程题(1)网上流传的一个华为笔试题_html

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_06乱七八糟编程题(1)网上流传的一个华为笔试题_搜索_07void search(int N,int K)乱七八糟编程题(1)网上流传的一个华为笔试题_搜索_08{

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_09 if(N>K*10)return;

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_09 if(N<0)return;

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_11乱七八糟编程题(1)网上流传的一个华为笔试题_多重集_12 if(N==0)乱七八糟编程题(1)网上流传的一个华为笔试题_搜索_08{

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_09  Count++;

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_09  return;

乱七八糟编程题(1)网上流传的一个华为笔试题_html_16 }

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_09 for(int i=0;i<=10;i++)//这里的10是指满环为十环

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_09  search(N-i,K-1);

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_19}

乱七八糟编程题(1)网上流传的一个华为笔试题_html

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_06乱七八糟编程题(1)网上流传的一个华为笔试题_搜索_07int main()乱七八糟编程题(1)网上流传的一个华为笔试题_搜索_08{

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_09 int N=90;

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_09 int K=10;//10枪

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_09 Count=0;

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_09 search(N,K);

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_09 cout<<Count<<endl;

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_09 return 0;

乱七八糟编程题(1)网上流传的一个华为笔试题_组合数_19}

乱七八糟编程题(1)网上流传的一个华为笔试题_html

乱七八糟编程题(1)网上流传的一个华为笔试题_html


用递归,数字比较小时还可以. 另外可以用数组保存中间结果,起一定的优化作用.

2).母函数

思路:(1+x^2+x^3+...+x^10)^10展开后,x^90的系数就是结果.(程序以后有空再写)

3).容斥原理

不太直观,说起来也麻烦.不过对这个问题肯定是适用的.

4).多重集的组合数

不是适用所有情况.(以打10枪为例,>=90环或<=10环时适用,原因就是一枪最多能打十环.)

打中90环相当于100环中有10环没打中,也可以说打中90环和10环的次数是相等的.

问题可转化为:求x0+x1+...+x9=10 (xi>=0,0<=i<=9)的解的个数,也就是多重集的组合数问题,结果为组合数:C(19,9).

C(19,9).也可以这样理解:

把10个物品放到10个箱子中,相当于从19个位置中选出9个做间隔,其余10个为物品.第一个间隔左边的物品放在第一个箱子中,位于第一、二个间隔中间的物品放在第二个箱子,如此类推,第九个间隔右边的物品放到第十个箱子中.