PKU1664:放苹果

放苹果
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 14790 Accepted: 9317

Description

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

 

Input

第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

 

Output

对输入的每组数据M和N,用一行输出相应的K。

 

Sample Input

17 3

Sample Output

8
原题地址:http://acm.pku.edu.cn/JudgeOnline/problem?id=1664
_________________________________________________________________________________________________________________
题解:
其实就是整数拆分问题。居然搜到了3种方法……不过基本上二和三是以一样的。

方法一:

F[i,j,k] = ∑ F[i-1,j-k,t] (t<=k<=j) 

              F[0,0,0] = 1

F[i,j,k]表示把j拆分成i个数,最大的数为k的方案数。

 

方法二:

将最大加数x不大于m的划分个数记作q(n,m)   

有   

                       1                                n=1 || m=1   

q(n,m)  =  {       q(n,n)                         n<m   

                       1+q(n,n-1)                     n=m   

                       q(n,m-1)+q(n-m,m)         n>m>1   

 

方法三:

①最少的盘子放了一个,这样每个盘子至少一个,n个盘子先放上n个,剩下的m-n个可以随便放   

②最少的盘子没有放,这样剩下的n-1个盘子还是随便放m个   

 

 

代码:(方法三)
代码
1 #include<stdio.h>
2  int m,n,t;
3  int work(int m,int n)
4 {
5 if (m<0) return 0;
6 if (m==0||n==1) return 1;
7 return work(m-n,n)+work(m,n-1);
8 }
9  int main()
10 {
11 scanf("%d",&t);
12 while (t--)
13 {
14 scanf("%d%d",&m,&n);
15 printf("%d\n",work(m,n));
16 }
17 return 0;
18 }

 

posted on 2010-07-28 13:00  风也轻云也淡  阅读(200)  评论(0编辑  收藏  举报