666:放苹果
总时间限制:
1000ms
内存限制:
65536kB
描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出
对输入的每组数据M和N,用一行输出相应的K。
样例输入
1
7 3
样例输出
8
来源
lwx@POJ
分析
将m个同样的苹果放到n个相同的盘子里
- 如果 m=0 有一种方法(盘子全空着)
- 如果 n=1 一种(全部苹果放一个盘子里)
- m<n 必然有 n-m个盘子空着,只有m个盘子能放,又因为盘子相同,所以可以转化为m个苹果放到m个盘子里,方案数相同即f[m,m]
- m>=n可以转化为两个问题每个盘子都不空,转化为先每个盘子都放然后再将剩下的苹果放到盘子里即 f[m-n,n];
- 至少有一个空盘子 f[m,n-1] 当递归深层的时候会逐层的考虑,空1个还是多个,因为空2个就相当于先空一个再空一个。
- 3号总方案就是两者的和
以f[m,n]表示m个相同苹果放到n个相同的盘子
那么
f[m,n]=f[m,n-1]+f[m-n,n] (m>=n)
=f[m,m] (n>m)
=1 ((m=0) or (n=0))
————————————————————————————————分割线———————————————————————————————————
代码如下
//放苹果
program p666;
var n,m,t:longint;
function dfs(m,n:longint):longint;
begin
if (m=0) or (n=1) then exit(1);
if m=n then exit(dfs(m,n-1)+dfs(m-n,n));
end;
begin
//assign(input,'D:/input/openjudge/p666.txt');
//reset(input);
//assign(output,'D:/output/openjudge/p666.txt');
//rewrite(output);
readln(t);
while t<>0 do
begin
dec(t);
readln(m,n);
writeln(dfs(m,n));
end;
//close(input);
//close(output);
end.
=n then exit(dfs(m,n-1)+dfs(m-n,n));
end;
begin
//assign(input,'D:/input/openjudge/p666.txt');
//reset(input);
//assign(output,'D:/output/openjudge/p666.txt');
//rewrite(output);
readln(t);
while t<>0 do
begin
dec(t);
readln(m,n);
writeln(dfs(m,n));
end;
//close(input);
//close(output);
end.
———————————————————————————————————————————————————————————————————————
状态: Accepted
—————————————————————————————————————————————————————————————————————