用python解决放苹果问题_放苹果

这篇博客探讨了如何使用Python解决将M个苹果放入N个盘子的组合问题。通过动态规划的方法,计算出不同放置方式的总数。程序实现包括两个版本:一个是基于二维数组的动态规划解决方案,另一个是递归实现。两种方法均能有效地求解问题并输出结果。
摘要由CSDN通过智能技术生成

/*

M个苹果放在N个盘子里分法有:dp[M][N], 0 <= M,N <= 10

设dp(m,n) 为m个苹果,n个盘子的放法数目,则先对n作讨论,

当m

当m>=n:不同的放法可以分成两类:

1、有至少一个盘子空着,即相当于dp(m,n) = dp(m,n-1);

2、所有盘子都有苹果,相当于可以从每个盘子中拿掉一个苹果,不影响不同放法的数目,即dp(m,n) = dp(m-n,n).

而总的放苹果的放法数目等于两者的和,即 dp(m,n) =dp(m,n-1)+dp(m-n,n)

初始条件说明

当m=0,n=0时,没苹果,没盘子,定为0种放法。这个条件在计算的时候用不到。题设至少一个盘子一个苹果。

当m=0,n>0时,没苹果,有盘子,定为1种放法。这个有点抽象,考虑:dp[1][1]=dp[1][0]+dp[0][1]=0+1。

当m>0,n=0时,有苹果,没盘子,定为0种放法。

dp两条路,第一条n会逐渐减少,终会到达出口n=0;

第二条m会逐渐减少,因为n>m时,会计算dp(m,m) 所以终会到达出口m=0.

*/

#include

#if US_DP

int dp[11][11];

int main()

{

int m, n;

while (scanf("%d%d", &m, &n) != EOF) {

for (int i = 1; i <= m; ++i)

dp[i][0] = 0;

for (int j = 1; j <= n; ++j)

dp[0][j] = 1;

for (int i = 1; i <= m; ++i) {

for (int j = 1; j <= n; ++j) {

if (i >= j)

dp[i][j] = dp[i][j-1]+dp[i-j][j];

else

dp[i][j] = dp[i][i];

}

}

printf("%d\n", dp[m][n]);

}

return 0;

}

#else

int f(int m, int n)

{

if (m >= 0 && n == 0)

return 0;

else if (m == 0 && n > 0)

return 1;

else if (m >= n)

return f(m, n-1)+f(m-n, n);

else

return f(m, m);

}

int main()

{

int m, n;

while (scanf("%d%d", &m, &n) != EOF)

printf("%d\n", f(m, n));

}

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值