• 打靶训练


    打靶训练

    题目

    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;
    }

    这样就理解了!
  • 相关阅读:
    javaWeb下载
    javaWeb上传
    JavaWeb过滤器
    JavaWeb中的监听器
    数据库dbutils
    数据库连接池
    51nod 1837 砝码称重【数学,规律】
    Codeforces Round #437 (Div. 2)[A、B、C、E]
    Codeforces Round #436 (Div. 2)【A、B、C、D、E】
    Codeforces Round #435 (Div. 2)【A、B、C、D】
  • 原文地址:https://www.cnblogs.com/xiaoerli520/p/9624121.html
Copyright © 2020-2023  润新知