算法分析——N个苹果放在N个盘子里的问题
2014-10-20 15:04
711 查看
问题的描述:现在有N个一模一样的苹果,要放在编号为1、2、3……、N的盘子里(假设盘子足够大,能放下所有的苹果),问一共有多少种放法?
算法分析:
用符号F(i,j)表示i个苹果放在j个盘子里的放法数
如果1号盘子里没有苹果,则i个苹果要放在剩余的j-1个盘子里
如果1号盘里有1个苹果,则剩余的i-1个苹果放在剩余的j-1个盘子里
如果1号盘里有2个苹果,则剩余的i-2个苹果放在剩余的j-1个盘子里
以此类推
如果1号盘里有i-1个苹果,则剩下的1个苹果放在j-1个盘子里
如果1号盘里有i个苹果,则剩下的j-1个盘子里没有苹果
于是得到以下的关系式
① F(i,j)=F(i,j-1)+F(i-1,j-1)+F(i-2,j-1)+……+F(1,j-1)+F(0,j-1)
由上面的式子可以得出
② F(i-1,j)=F(i-1,j-1)+F(i-2,j-1)+……+F(1,j-1)+F(0,j-1)
回代到①可知
③ F(i,j)=F(i,j-1)+F(i-1,j)
另由定义可知,
④ F(i,1)=1
⑤ F(1,i)=i
根据式子③④⑤,推测F(i,j)的计算公式为
⑥ F(i,j)=C(i,i+j-1) 注:C(M,N)表示组合数,表示N个里面选M的个数。组合数的计算公式这里不描述了
下面用数学归纳法证明式子⑥的正确性
证明:
F(i,1)=C(i,i+1-1)=C(i,i)=1 式子④满足式子⑥
F(1,i)=C(1,1+i-1)=C(1,i)=i 式子⑤满足式子⑥
假设F(i,j-1)、F(i-1,j)满足式子⑥
F(i,j-1)=C(i,i+j-1-1)=C(i,i+j-2)
F(i-1,j)=C(i-1,i-1+j-1)=C(i-1,i+j-2)
则由式子③可知
F(i,j)=F(i,j-1)+F(i-1,j)=C(i,i+j-2)+C(i-1,i+j-2)=C(i,i+j-1) 满足式子⑥
由此证明式子⑥的正确性
故计算公式为
F(i,j)=C(i,i+j-1)
那么
3个苹果放在3个盘子里的放法数为F(3,3)=C(3,3+3-1)=C(3,5)=10
2个苹果放在4个盘子里的放法数为F(2,4)=C(2,2+4-1)=C(2,5)=10
7个苹果放在7个盘子里的放法数为F(7,7)=C(7,7+7-1)=C(7,13)=1716
10个苹果放在10个盘子里的放法数为F(10,10)=C(10,10+10-1)=C(10,19)=92378
N个苹果放在N个盘子里的放法数为F(N,N)=C(N,2N-1)
整数划分问题和正整数连续划分问题:/article/4740771.html讲的很细致
放苹果问题:把m个苹果放到n个盘子里,允许有空,有多少种放法http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=2679
递归方程:f(m,n) = f(m,n-1) + f(m-n,n) //每次分有两种分法
f(m,n-1):把m个苹果放到n-1个盘子里,也就是说至少有一个空
f(m-n,n):先在每个盘子里放一个苹果,然后再把剩余苹果(m-n)放到n个盘子里,也就是说每个盘子里至少有一个
1.n == 1 || m == 1 即只有一个盘子或者只有一个苹果,显然只有一种分法;
2.m < n 即苹果数小于盘子数,这种情况f(m,n) ---> f(m,m)
3.m == n 此时每个盘子里至少一个只有一种情况所以为 1 + f(m,n-1)
4.m > n f(m,n-1) + f(m-n,n) (如一开始所说)
#include <</span>stdio.h>
int f(int m
, int n)
{
if(m == 1 || n== 1 || m == 0) return 1;
if(m < n) return f(m,
m);
return f(m - n,
n) + f(m, n - 1);
}
int main(void)
{
int n , m , z;
scanf("%d", &z);
while(z-- > 0)
{
scanf("%d%d", &m
,&n);
printf("%d\n",f(m,
n));
}
return 0;
}
作者:万仓一黍
出处:http://grenet.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
算法分析:
用符号F(i,j)表示i个苹果放在j个盘子里的放法数
如果1号盘子里没有苹果,则i个苹果要放在剩余的j-1个盘子里
如果1号盘里有1个苹果,则剩余的i-1个苹果放在剩余的j-1个盘子里
如果1号盘里有2个苹果,则剩余的i-2个苹果放在剩余的j-1个盘子里
以此类推
如果1号盘里有i-1个苹果,则剩下的1个苹果放在j-1个盘子里
如果1号盘里有i个苹果,则剩下的j-1个盘子里没有苹果
于是得到以下的关系式
① F(i,j)=F(i,j-1)+F(i-1,j-1)+F(i-2,j-1)+……+F(1,j-1)+F(0,j-1)
由上面的式子可以得出
② F(i-1,j)=F(i-1,j-1)+F(i-2,j-1)+……+F(1,j-1)+F(0,j-1)
回代到①可知
③ F(i,j)=F(i,j-1)+F(i-1,j)
另由定义可知,
④ F(i,1)=1
⑤ F(1,i)=i
根据式子③④⑤,推测F(i,j)的计算公式为
⑥ F(i,j)=C(i,i+j-1) 注:C(M,N)表示组合数,表示N个里面选M的个数。组合数的计算公式这里不描述了
下面用数学归纳法证明式子⑥的正确性
证明:
F(i,1)=C(i,i+1-1)=C(i,i)=1 式子④满足式子⑥
F(1,i)=C(1,1+i-1)=C(1,i)=i 式子⑤满足式子⑥
假设F(i,j-1)、F(i-1,j)满足式子⑥
F(i,j-1)=C(i,i+j-1-1)=C(i,i+j-2)
F(i-1,j)=C(i-1,i-1+j-1)=C(i-1,i+j-2)
则由式子③可知
F(i,j)=F(i,j-1)+F(i-1,j)=C(i,i+j-2)+C(i-1,i+j-2)=C(i,i+j-1) 满足式子⑥
由此证明式子⑥的正确性
故计算公式为
F(i,j)=C(i,i+j-1)
那么
3个苹果放在3个盘子里的放法数为F(3,3)=C(3,3+3-1)=C(3,5)=10
2个苹果放在4个盘子里的放法数为F(2,4)=C(2,2+4-1)=C(2,5)=10
7个苹果放在7个盘子里的放法数为F(7,7)=C(7,7+7-1)=C(7,13)=1716
10个苹果放在10个盘子里的放法数为F(10,10)=C(10,10+10-1)=C(10,19)=92378
N个苹果放在N个盘子里的放法数为F(N,N)=C(N,2N-1)
整数划分问题和正整数连续划分问题:/article/4740771.html讲的很细致
放苹果问题:把m个苹果放到n个盘子里,允许有空,有多少种放法http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=2679
递归方程:f(m,n) = f(m,n-1) + f(m-n,n) //每次分有两种分法
f(m,n-1):把m个苹果放到n-1个盘子里,也就是说至少有一个空
f(m-n,n):先在每个盘子里放一个苹果,然后再把剩余苹果(m-n)放到n个盘子里,也就是说每个盘子里至少有一个
1.n == 1 || m == 1 即只有一个盘子或者只有一个苹果,显然只有一种分法;
2.m < n 即苹果数小于盘子数,这种情况f(m,n) ---> f(m,m)
3.m == n 此时每个盘子里至少一个只有一种情况所以为 1 + f(m,n-1)
4.m > n f(m,n-1) + f(m-n,n) (如一开始所说)
#include <</span>stdio.h>
int f(int m
, int n)
{
if(m == 1 || n== 1 || m == 0) return 1;
if(m < n) return f(m,
m);
return f(m - n,
n) + f(m, n - 1);
}
int main(void)
{
int n , m , z;
scanf("%d", &z);
while(z-- > 0)
{
scanf("%d%d", &m
,&n);
printf("%d\n",f(m,
n));
}
return 0;
}
作者:万仓一黍
出处:http://grenet.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章推荐
- 放苹果问题 DP计数 m个苹果放在n个盘子里,苹果,盘子相同,盘子可为空
- 算法分析——N个苹果放在N个盘子里的问题
- 把n个同样的苹果放在m个同样的盘子里
- 整数划分问题(苹果盘子问题)
- 递推中的n个苹果放入m个盘子问题
- 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
- m个苹果n个盘子问题
- m个苹果放入n个盘子问题
- 将m个苹果放入n个盘子的问题【转】
- 把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法
- m个苹果放在n个盘子里面有多少种放法?(动态规划)
- 在PV操作中会有一个经典的例子就是爸爸妈妈儿子女儿吃水果问题,爸爸妈妈向盘子里放入水果,儿子女儿向盘子取水果。然而爸爸只向盘子放苹果,妈妈只向盘子放橘子,女儿只能吃苹果,儿子只能吃橘子。并且盘子里只能
- 分治法求解放苹果问题(量子力学的状态问题,完全相同的苹果和完全相同的盘子)
- 把M个同样的苹果放在N个同样的盘子里
- 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
- 把M个同样的苹果放在N个同样的盘子里
- 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
- 算法小题:m个相同的苹果,放在n个相同的盘子中,求有多少种结果
- (11)分苹果问题:将m个相同的苹果放到n个相同的盘子中,多少钟分法?
- m个苹果放入n个盘子问题