题解 | #放苹果#

放苹果

https://www.nowcoder.com/practice/4f0c1e21010e4d849bde5297148e81d9

递归版本

#include <stdio.h>

// 递归函数计算分苹果的方法数
int partition(int m, int n) {
    if (m == 0 || n == 1) {
        return 1; // 若苹果数为0或盘子数为1,只有一种分法
    }

    if (m < n) {
        return partition(m,m); 
        // 若苹果数小于盘子数,等同于每个盘子都盛放一个苹果
    } else {
        return partition(m, n - 1) + partition(m - n, n); 
        // 分为有一个盘子空着和每个盘子都有苹果两种情况
    }
}

int main() {
    int m, n;

    // 读取每行输入数据,计算分法并输出结果
    while (scanf("%d %d", &m, &n) != EOF) {
        int result = partition(m, n);
        printf("%d\n", result);
    }

    return 0;
}

动态规划版本

#include <stdio.h>

// 动态规划函数计算分苹果的方法数
int partition_dp(int m, int n) {
    int dp[11][11] = {0}; // 定义动态规划数组,dp[i][j]表示将i个苹果放入j个盘子的方法数

    // 初始化边界条件,若苹果数为0或盘子数为1,只有一种分法
    for (int i = 0; i <= m; i++) {
        dp[i][1] = 1;
    }
    for (int j = 1; j <= n; j++) {
        dp[0][j] = 1;
    }

    // 动态规划递推计算方法数
    for (int i = 1; i <= m; i++) {
        for (int j = 2; j <= n; j++) {
            if (i >= j) {
                dp[i][j] = dp[i][j-1] + dp[i-j][j]; // 分为有一个盘子空着和每个盘子都有苹果两种情况
            } else {
                dp[i][j] = dp[i][i]; // 若苹果数小于盘子数,等同于每个盘子都盛放一个苹果
            }
        }
    }

    return dp[m][n]; // 返回最终计算得到的结果
}

int main() {
    int m, n;

    // 读取每行输入数据,计算分法并输出结果
    while (scanf("%d %d", &m, &n) != EOF) {
        int result = partition_dp(m, n);
        printf("%d\n", result);
    }

    return 0;
}

全部评论

相关推荐

昨天 21:59
门头沟学院 Java
点赞 评论 收藏
分享
爱吃肉的伊登在写日记:好棒,27届简历能做成这个样子,但是第一个项目感觉cover住难度还是不小的,特别是二面的时候肯定要对分布式系统设计这一块儿有高出正常面试者的水平才行
点赞 评论 收藏
分享
学java时间比较短不到三个月,基本的技术栈都过了一遍就是都不太深,有个小项目。是继续找实习还是沉淀准备秋招呢?找实习的话会花很多时间在八股,放弃的话又怕秋招简历太难看。有无大佬支招
今天java了吗:1.一定要找实习,实习不一定要去,但是找实习过程中的面试经验和心态经验才是最重要的 2.八股本来就是大头,甚至比项目重要 3.这个时间段也是面试比较多的阶段,可以抓住机会锻炼。面试才会发现自己的不足,感觉自己会了和能给面试官娓娓道来是两码事
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务