博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
邮票面值设计 (动态规划+DFS)
阅读量:4696 次
发布时间:2019-06-09

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

题意:

思路:

  深度搜索:每一层枚举一个面值,然后通过dp进行检查,并通过已知面值得到最多n张得到的最大表示数。

       其实,该搜索就是一个比较裸的,进行剪枝,枚举的面值还是存在范围的,上一次面值+1~n*sum(sum表示所有已知面值相加,其实这只是一个粗糙的剪枝,但是,对于我这种弱鸡莱来说还是香)

更多,细节的解释还是在代码里。还有,有多余的输出,需要自己去删除。

#include
#include
#include
using namespace std;int n, k, res, ans[105], f[2005], curans[105];int solve(int dep, int sum){ memset(f, 0x3f, sizeof(f)); f[0] = 0; for (int i = 1; i <= dep; ++i){ for (int j = curans[i]; j <= n*sum; ++j) //完全背包,f[i]记录的是在已知的面值中选择最少数量 f[j] = min(f[j], f[j - curans[i]] + 1); //如果最少数量大于n时,说明i这个数字不能表示,但是 } //i-1表示可表示的最大值。 for (int i = 1; i <= n*sum; ++i){ if (f[i] > n){ return i - 1; } } return n*sum;}void dfs(int dep, int last, int maxn, int sum){ if (dep > k){ //dep作为递归结束,maxn是一个估计上界(因为不能无限 if (res < maxn){ //枚举下去,但是面值肯定小于n*sum) res = maxn; //而枚举的下界就是i+1 for (int i = 1; i <= k; ++i){ ans[i] = curans[i]; } } return; } for (int i = last + 1; i <= maxn + 1; ++i){ curans[dep] = i; int x = solve(dep, sum + i); cout << "dep=" << dep<

 

转载于:https://www.cnblogs.com/ALINGMAOMAO/p/10355545.html

你可能感兴趣的文章
Linux: Check version info
查看>>
stl学习之测试stlen,cout等的运行速度
查看>>
魔戒三曲,黑暗散去;人皇加冕,光明归来
查看>>
Error和Exception
查看>>
Python和Singleton (单件)模式[转载]
查看>>
httpclient设置proxy与proxyselector
查看>>
IT常用单词
查看>>
拓扑排序
查看>>
NYOJ--32--SEARCH--组合数
查看>>
JMS
查看>>
gulpfile 压缩模板
查看>>
【34.14%】【BZOJ 3110】 [Zjoi2013]K大数查询
查看>>
【 henuacm2016级暑期训练-动态规划专题 A 】Cards
查看>>
第五篇:白话tornado源码之褪去模板的外衣
查看>>
设备常用框架framework
查看>>
bootstrap模态框和select2合用时input无法获取焦点(转)
查看>>
21世纪经济网APP
查看>>
解决NetworkOnMainThreadException
查看>>
1039 到底买不买
查看>>
农银电商项目学习笔记(一)
查看>>