您的位置:首页 > 其它

POJ 1664 放苹果

2017-04-18 15:39 239 查看
放苹果

Time Limit: 1000MS Memory Limit: 10000K
Total 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
1
7 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--plates
if(dp2[m]
) return dp2[m]
;
else if(m==0||n==1) {
dp2[m]
=1;
return 1;
}
else if(m<n) {
dp2[m]
=dp(m,m);
return dp2[m]
;
}
else{//m>=n
dp2[m]
=dp(m,n-1)+dp(m-n,n);
return dp2[m]
;

}
}
int main(){
//init();
int m,n;
cin>>m>>n;

while(!cin.eof()){
cout<<dp(m,n)<<endl;
cin>>m>>n;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: