放苹果:
题目描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
解:
先把情况都列举一下:
1.只有苹果,没有盘子——返回0
2.只有盘子,没有苹果——返回1
3.苹果的数量大于盘子:
(1)所有的盘子里都有苹果
假设有m个苹果,n个盘子,这种情况和m-n个苹果,n个盘子的分法是一样的,相当于从每个盘子里都拿出一个苹果来——返回dp[m-n][n]
(2)至少有一个盘子空着
假设有m个苹果,n个盘子,现在有一个盘子空着,就和m个苹果,n-1个盘子的分法是相同的——返回dp[m][n-1],如果有多个盘子空着,就递归-1。
分完情况就可以敲代码了
#include <iostream>
using namespace std;
int dp[11][11];
int main()
{
int m,n;
while(cin>>m>>n)
{
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][j] + dp[i][j-1];
}
else
{
dp[i][j] = dp[i][i];
}
}
}
cout<<dp[m][n]<<endl;
}
return 0;
}