题目链接:http://acm-software.hrbust.edu.cn/problem.php?id=1472

题意:给n个硬币,面值随意。问恰好凑成m元的种类数(去掉重复)。

dp(i,j,k)表示i个硬币,j元,最大是k时的种类数。

一开始智障记忆化dfs暴T不止,转成递推还是会T。

结果就考虑先给记忆化dfs加一些剪枝,还是T。

再给递推做一些处理,发现是因为枚举当前最大的时候,最大的l如果是j+2了,即使只有它一个,也是大于j+1了。换到这里来看,是前向着递推,那也就是说,题目所述最小面值是1,在递推的时候仅仅维持在j内是不满足的,需要j+1。

 #include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod = ;
const int maxn = ;
LL dp[maxn][maxn][maxn];
int n, m; LL dfs(int n, int m, int pre) {
if(dp[n][m][pre] != -) return dp[n][m][pre];
// if(pre > m) return dp[n][m][pre] = 0;
if(n == ) {
if(m == ) return dp[n][m][pre] = ;
return dp[n][m][pre] = ;
}
dp[n][m][pre] = ;
for(int i = pre; i <= m; i++) {
if(m - i < ) break;
dp[n][m][pre] = (dp[n][m][pre] + dfs(n-, m-i, i)) % mod;
}
return dp[n][m][pre];
} int main() {
// freopen("in", "r", stdin);
int T;
scanf("%d", &T);
memset(dp, , sizeof(dp));
dp[][][] = ;
for(int i = ; i <= ; i++) {
for(int j = ; j <= ; j++) {
for(int k = ; k <= ; k++) {
if(dp[i][j][k] == ) continue;
for(int l = k; j + l <= ; l++) {
if(l > j + ) break;
dp[i+][j+l][l] = (dp[i+][j+l][l] + dp[i][j][k]) % mod;
}
}
}
}
while(T--) {
scanf("%d%d",&n,&m);
LL ret = ;
for(int i = ; i <= m; i++) {
ret = (ret + dp[n][m][i]) % mod;
}
printf("%lld\n", ret);
}
return ;
}

最新文章

  1. sql server 替换特殊符号
  2. 把textarea右下角的灰点去掉
  3. OpenFileDialog获取文件名和文件路径问题
  4. 认识CPU Cache
  5. linux 中的快捷键
  6. Android中弹出输入法界面不影响app界面布局
  7. 使用EA逆向生成数据库E-R图
  8. hibernate总结四
  9. 利用svg技术实现在线动画演示
  10. c 按输入的字母来输出对应效果
  11. 疯狂Android演讲2 环境配置
  12. SpriteBuilder实现2D精灵光影明暗反射效果(二)
  13. SDL 开发实战(二):SDL 2.0 核心 API 解析
  14. NoSuchMethodError 问题
  15. vue created中初始化属性
  16. 行为型---命令模式(Command Pattern)
  17. 解决Zabbix网页端Get value error: cannot connect to [[192.168.238.139]:10050]: [113] No route to host问题
  18. @media响应式的屏幕适配
  19. Monkey测试执行_真机测试(2)
  20. win7安装sqlserver2008

热门文章

  1. 用jQuery创建HTML中不存在的标签元素碰到的问题
  2. Maven3.x 插件开发入门
  3. [转]Rotate a table in reporting services
  4. 1. python中的随机函数
  5. samba服务器源码安装(非rpm)
  6. Android中的图片压缩
  7. [ios][opengles]GLKit如何搭一个app的框架
  8. 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind
  9. 关于plsql表如何创建自增长列
  10. Labeling Balls 分类: POJ 2015-07-28 19:47 10人阅读 评论(0) 收藏