当前位置:首页 > 题解目录 > 正文内容

【题解】航空母舰

亿万年的星光5年前 (2021-05-01)题解目录6010

3.航空母舰(aircraft.cpp)

【题目描述】

航空母舰(Aircraft Carrier),是一种以舰载机为主要作战武器的大型水面舰艇。依靠航空母舰,一个国家可以在远离其国土的地方、不依靠当地机场情况施加军事压力和进行作战。航空母舰已经是现代海军不可或缺的利器。也成为一个国家综合国力的象征。

假如,某国家有M艘相同的航空母舰,要把它们停放在N个相同的港口上,允许有的港口空着不用,问:共有多少种不同的停法(用K表示)?注意:5,1,1和1,5,1是同一种分法。

【输入描述】

第一行是测试数据数目t(0<=t<=20),以下每行均包含两个整数M和N,已空格分开。1<=M,N<=10。

【输出描述】

对输入的每组数据M和N,用一行输出相应的K。

【样例输入】

1
7 3


【样例输出】

8

【题目分析】



【参考代码1】

#include<bits/stdc++.h>
using namespace std;
//本题的算法思想为递归
int q(int n,int m)
{
    if(n==1||m==1)//当二者任意为1则就是一种
    {
        return 1;
    }
    if(n<m)  return q(n,n);//当m>n时没有意义便为q(n,n)
    /*n=m时可以分为两种情况,一个是使用n本身,只有一种情况。二个是使用不大于n-1的整数进行拆分。
    所以此时q(n,m)=1+q(n,n-1);*/
    if(n==m)
    {
        return q(n,m-1)+1;
    }
    /*
    n>m这时候有两种情况,一个是使用m对n进行拆分,一个是使用小于m的数对n进行拆分

对于第一个,使用m对n进行拆分,所以拆分出来的情况最大的数是m,剩下的所有数加起来为n-m,问题变成使用不大于m的整数对n-m进行拆分,所以此时为q(n-m,m)

对于第二个,使用小于m的数对n进行拆分,表示为q(n,m-1)
    */
    if(n>m)
        return q(n,m-1)+q(n-m,m);
}

int main()
{
    int n, m;
    int t;
    cin>>t;
    for(int i=0; i<t; i++)
    {
        cin>>n>>m;
        int k = q(n,m);
        cout<<k<<endl;
    }
    return 0;
}


【参考代码2】

#include<iostream>
#include<cstring>
using namespace std;
int a[20][20];
int f(int m,int n)
{
    int i,j;
    for(i=1;i<=n;i++)//0个苹果
        a[0][i]=1;
    for(i=1;i<=m;i++)//1个盘子
        a[i][1]=1;
    for(i=1;i<=m;i++)
        for(j=2;j<=n;j++)
            if(i<j)
                a[i][j]=a[i][i];
            else 
                a[i][j]=a[i][j-1]+a[i-j][j]; 
}
int main()
{
    int m,n,i,j,k;
    cin>>k;
    for(i=1;i<=k;i++)
    {
        cin>>m>>n;
        f(m,n);
        cout<<a[m][n]<<endl;
    }
    return 0;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

标签: 递归
分享给朋友:

相关文章

【题解】分糖果问题

【题解】分糖果问题

【题目描述】一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:每个孩子不管得分多少,起码分到一个糖果。任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)给定一个数组 a...

【题解】前缀最大值

【题目描述】求一个数列的所有前缀最大值之和。即:给出长度为n的数列a[i],求出对于所有1<=i<=n,max(a[1],a[2],...,a[i])的和。比如,有数列:666 304 6...

2021年市北区程序设计竞赛试题(初中组)

2021年市北区程序设计竞赛试题(初中组)

1.开关灯(light.cpp)【题目描述】某实验室共有n盏灯,灯的编号为1~n,每盏灯的初始状态是关闭的。现在有m位学生,每位学生可以前去抽取一张带数字的卡片,其数字为Ai,然后依次将自己手中的数字...

大象喝水

【题目描述】上课的时候老师问了小蒜蒜和同学们一个问题:一只大象口渴了,要喝 20 升水才能解渴,但现在只有一个深 h 厘米,底面半径为 r厘米的小圆桶...

【题解】石子合并

【题目描述】在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。设计一个程序,计算出将N堆石子合并成一堆的...

【题解】求最长不下降序列

【题目描述】设有由n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)且b(i)≠b(j)(i≠j),若存在i1<i2<i3<…<ie 且有b...