博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1664 dp记忆化搜索
阅读量:7287 次
发布时间:2019-06-30

本文共 1056 字,大约阅读时间需要 3 分钟。

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
/**poj1664 dp记忆化搜索写法题目大意:中文题不在赘述解题思路:(转)令f(m,n)表示m个苹果放到n个盘子里有多少种放法,以下对不同的情况给予讨论:          (1):当盘子数为1的时候,仅仅有一种放法就是把全部苹果放到一个盘子里。          (2):当苹果数为1的时候,也仅仅有一种放法,注意题目中说明,盘子之间并无顺序,所以无论这个苹果放在哪个盘子里,结果都算一个。          (3):当m
n时,也分两种情况讨论,一种是至少有一个盘子里不放苹果。这样子就相当于f(m,n-1),另外一种是,先取出n个苹果一个盘子里放一个,再将剩下的m-n个苹果放到n个盘子里去,即f(m-n,n); 综上所述得到递归表达式:f(m,n)=1 当 m=1或n=1; f(m,n)=f(m,m) 当m
#include
#include
#include
using namespace std;int n,m;int dp[15][15];int dfs(int n,int m){ if(dp[n][m])return dp[n][m]; if(n==1||m==1) { dp[n][m]=1; return dp[n][m]; } if(n
m) { dp[n][m]=dfs(n,m-1)+dfs(n-m,m); return dp[n][m]; }}int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); memset(dp,0,sizeof(dp)); printf("%d\n",dfs(n,m)); } return 0;}

转载地址:http://napjm.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
zabbix表字段类型和value type问题
查看>>
shoususaiBti
查看>>
solr5.5.5独立部署(不使用tomcat)
查看>>
WINDOWSXP启动时直接进入系统而无需入用户名和密码
查看>>
论测试的主要责任
查看>>
关于测试团队的组织
查看>>
如何解决WEB性能测试中的验证码问题
查看>>
WinPe3.1启动系统逐步完善专题02:软件环境搭建
查看>>
思科模拟器——使用路由器分割局域网
查看>>
Tomcat日志配置
查看>>
Apache Spark源码走读之14 -- Graphx实现剖析
查看>>
2017年以后武汉的房价还会涨吗?
查看>>
10个免费开源的JS音乐播放器插件
查看>>
手机端-ajax跨域请求滚屏分页
查看>>
[转] Tips - C#获取LastError
查看>>
hdu - problem 1671 Phone List【字典树】
查看>>
Spring全家桶——SpringBoot渐入佳境
查看>>
杭电2028--Lowest Common Multiple Plus
查看>>
Java 回调机制
查看>>