首页 > 试题广场 >

放苹果

[编程题]放苹果
  • 热度指数:159853 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
注意:如果有7个苹果和3个盘子,(5,1,1)和(1,5,1)被视为是同一种分法。

数据范围:



输入描述:

输入两个int整数



输出描述:

输出结果,int型

示例1

输入

7 3

输出

8
#include <stdio.h>

int plant(int m,int n)
{
    if (n == 1 || m == 0) //当只有一个盘子或者没有苹果时
    {
        return 1;
    }

    if (m < 0 || n < 1)
    {
        return 0;
    }

    return plant(m, n-1) + plant(m-n, n);//前一种是可以盘子空放,后一种是至少放一个
}

int main()
{
    int m=0;
    int n=0;
    scanf("%d %d",&m,&n);
    int ret = plant(m,n);
    printf("%d",ret);
    return 0;
}
编辑于 2023-12-10 17:34:58 回复(0)
#include <stdio.h>

int method(int m,int n)
{
    if(m<0||n<0)//如果数量或者盘子<=0那么就返回0,因为相当于没有这样的情况
    {
        return 0;
    }
    if(m == 1||n==1)//如果数量为1盘子大于0或者盘子为1数量大于0,那么放法只有1种
    {
        return 1;
    }
    return method(m, n-1) + method(m-n,n);//(m,n) = (m,n-1)+(m-n,n);总数等于多一个空盘数加上每个盘子多加一个数
}

int main() {
    int m, n;
    while (scanf("%d %d", &m, &n) != EOF) {
        int ret = method(m,n);
        printf("%d\n",ret);
    }
    return 0;
}
发表于 2023-10-12 10:59:33 回复(0)
#include <stdio.h>
//递归
int sd(int m,int n){
    if(n==1 || m<=1){//只有一个苹果或只有一个盘子时只有一种情况
        return 1;
    }
    else if(m>=n){
        //苹果多于盘子时等效为
        //每个盘子放一个再分配剩余的苹果到盘子(递归到没苹果可放)
        //+考虑留有空盘再分配其他苹果(递归到只剩一个盘子)
        return sd(m-n,n)+sd(m,n-1);
    }
    else{
        return sd(m,m);//盘子数只要多于苹果数就等效于苹果数量的盘子放苹果
    }
}
int main(){
    int m,n;
    scanf("%d %d",&m,&n);
    //printf("%d",sd(m,n));
        //动态规划
    int dp[m+1][n+1];//建立表示m,n大小的状态矩阵
    for(int i=0;i<=n;i++){//初始化
        dp[0][i]=1;
        dp[1][i]=1;
    }
    for(int i=0;i<=m;i++){//初始化
        dp[i][0]=0;
        dp[i][1]=1;
    }
    int min;
    if(m>=n){
        min=n;
    }
    else{
        min=m;
    }
    for(int i=2;i<=min;i++){
        for(int j=2;j<=i;j++){
            dp[i][j]=dp[i][j-1]+dp[i-j][j];
        }
        for(int j=i+1;j<=min;j++){
            dp[i][j]=dp[i][i];
        }
    }
    if(m>=n){//补全状态矩阵
        for(int i=n+1;i<=m;i++){
            for(int j=2;j<=n;j++){
                dp[i][j]=dp[i][j-1]+dp[i-j][j];
            }
        }
    }
    else{
        for(int i=2;i<=m;i++){
            for(int j=m+1;j<=n;j++){
                dp[i][j]=dp[i][m];
            }
        }
    }
    printf("%d",dp[m][n]);
}

发表于 2022-06-14 23:50:51 回复(0)
#include <stdio.h>
#define    N        11
int main()
{
    int f[N][N],m,n,i,j;
    scanf("%d%d",&m,&n);
    for(i=0;i<N;i++)        //i为苹果个数
    {
        for(j=1;j<N;j++)    //j为盘子个数
        {
            if(i==0||i==1)
                f[i][j]=1;
            else
            {
                if(j==1)
                    f[i][j]=1;
                else
                {
                    if(i<j)
                        f[i][j]=f[i][i];
                    else
                        f[i][j]=f[i][j-1]+f[i-j][j];
                }  
            }
        }
    }
    printf("%d\n",f[m][n]);
    return 0;
}

发表于 2022-04-23 19:33:04 回复(1)
#include <stdio.h>

int arrange(int m, int n)
{
    if(m == 0 || n == 1) return 1;
    if(n>m) return arrange(m, m);
    else return arrange(m, n-1)+arrange(m-n,n);
}

int main()
{
    int mn[2] = {0,0};
    int tmp = 0,cnt = 0;
    
    while(scanf("%d",&tmp) != EOF)
    {
        mn[cnt++] = tmp;
        if(cnt == 2)
        {
            cnt = 0;
            int p = arrange(mn[0], mn[1]);
            printf("%d\n",p);
        }
    }
    return 0;
}

发表于 2021-09-05 10:40:19 回复(0)
#include <stdio.h>
#include <stdlib.h>
int func(int m,int n)
{
    if(n<0||m<0)
    {
        return 0;
    }
    else if(m==1||n==1)
    {
        return 1;
    }
    else
    {
        return func(m,n-1)+func(m-n,n);
    }
}

int main()
{
    int m,n;
    while(scanf("%d %d",&m,&n)!=EOF)
    {
        printf("%d\n",func(m,n));
    }
    return 0;
}


发表于 2021-07-16 12:02:51 回复(1)