POJ 1664 放苹果

来源:互联网 发布:php跨数据库查询 编辑:程序博客网 时间:2024/06/03 07:37
放苹果
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 33721 Accepted: 20870

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

Source


考虑:m为苹果数,n为盘子数;

如果苹果个数为0,或者盘子个数为1,则放置方式只有一种

如果苹果个数<盘子数,那么肯定有空的盘子,这些盘子就不考虑了

如果苹果个数>=盘子数:

                                      可以选一个盘子不放苹果,就是f(m,n-1)

                                      或者所有盘子都得放苹果,那就是f(m-n,n)

所以结果就是二者的加和。


需要考虑打表/记忆化搜索以缩小时间代价。

以上的递推式详见代码



//@auther zhou//@Number 201408070203//@start time://@finish time:/*@此处注意:*//* 测试数据*/#include<iostream>#include<cstring>#include<vector>#include<cmath>#include<algorithm>using namespace std;int dp2[21][21]={0};int dp(int m,int n){//m--apples//n--platesif(dp2[m][n]) return dp2[m][n];else if(m==0||n==1) {dp2[m][n]=1;return 1;}else if(m<n) {dp2[m][n]=dp(m,m);return dp2[m][n];}else{//m>=ndp2[m][n]=dp(m,n-1)+dp(m-n,n);return dp2[m][n];}}int main(){//init();int m,n;cin>>m>>n;while(!cin.eof()){cout<<dp(m,n)<<endl;cin>>m>>n;}return 0;}


0 0
原创粉丝点击