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 }