打靶训练

打靶训练

题目

1
一个射击运动员打靶,靶一共有10环,连开10枪打中90环的情况有多少种?需要考虑10枪的先后关系,比如9环10环同10环9环是不同的。
  • 可以直接暴力十个for 在最后一个for里面判断 空间和时间复杂度都太大了

  • 使用递归的方式 减少空间复杂度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
int sum;
int store[10];
void Output() //打印
{
for(int i=9;i>=0;i--)
{
cout<<store[i]<<" ";
}
cout<<endl;
++sum;
}

void Comput(int score, int num)
{
if(score<0 || score>(num+1)*10) // 前者是因为已经打满了90环 在Comput的第一个参数有个减法 后者是不可能打满90环
return ;
if(num==0) //打到最后一次 直接将剩下的环数进行匹配 这样避免了最后一次的for循环
{
store[num]=score;
Output();
return;
}
for(int i=0;i<=10;i++) //没有出现上述情况,递归
{
store[num]=i; // 这一发打了多少环 0-10环循环
Comput(score-i,num-1); // 下一发应该打的目的
}
}

int main()
{
Comput(90,9);
cout<<sum<<endl;
return 0;
}

这样就理解了!
posted @ 2018-09-10 23:25  guoguoqingzhe  阅读(352)  评论(0编辑  收藏  举报