理解苹果多于盘子的情况/C++

放苹果

https://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf

#include<iostream>
#include <vector>
using namespace std;
/*
这个题主要就是要理解当苹果数大于盘子数的时候。
如果需要全部放满,那很容易,就是将每个盘子先放一个,再处理剩下的苹果,因此为 PutApple(m - n, n)
如果不全部放满,即至少有一个盘子是空的。这个时候为什么就是PutApplem, n - 1),而不是继续加上PutApple(m, n - 2)..PutApple(m, n - 3)?
这是因为,我们*没有具体讨论到底有几个盘子是空的*,拿掉一个盘子之后的问题包含了所有可能的空盘子的个数。
*/
int PutApple(int m, int n){
    if(m == 0 || n == 1)
        return 1;
    else if(m < n)
        return PutApple(m,m);
    else
        return PutApple(m -n , n) + PutApple(m, n-1);
}

int PutApple_dp(int m, int n){

    // vector<vector<int> > dp(m+1, vector<int>(n+1,1));
    vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0)); 
     for(int i = 1; i <= n; i++)
        dp[0][i] = 1; //0个苹果只有1种分法
    // for(int i = 1; i <= m; i++)
    //     dp[i][0] = 0; //0个盘子有0种分法

    for(int i = 1; i <=m; i++){
        for(int j = 1; j <=n; j++){
            if(i < j)
                dp[i][j] = dp[i][i];
            else
                dp[i][j] = dp[i-j][j] + dp[i][j-1];
        }
    }

    return dp[m][n];

}

int main(){
    int m, n;
    while(cin >> m >> n) //输入苹果数和盘子数
        cout << PutApple_dp(m, n) << endl; //递归解决
    return 0;
}

全部评论

相关推荐

06-02 15:17
门头沟学院 Java
心爱的idea:怎么会呢 应该是打招呼有问题 问就说实习6个月全国可飞随时到岗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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