【暴力搜索】【动态规划】[NOIP 1999]邮票面值设计
2015-07-22 15:49
323 查看
其实就是枚举每一个邮票的面值记得保持严格递增,然后DP判断每一次最多能够凑出1-哪个面值的邮票,然后下限显然就是前面一张邮票的面值+1,上限是当前能够凑出的邮票的面值+1因为显然如果当前最大为nn那么如果这张面值为n+2n+2那么显然n+1n+1不能由原来的组合构成(原来只能弄出nn)那么现在新加入了一个只会变得n+2>n+1n+2>n+1那么显然n+1n+1永远凑不出来,那么显然同理不能选择大于n+1n+1的所有数字当作上限。关于DP就是个背包,自己推一下吧。
[code]#include <iostream> #include <cstdio> #include <cstring> #include <vector> using namespace std; #define MAXK 200 #define MAXN 50 #define MAXEND 10000 #define INF 0x7f7f7f7f int K,N,F[MAXEND+10],Max; vector<int> save; vector<int> w; int ret; int dp(int E, int n){ memset(F, INF, sizeof F); F[0] = 0; for(int V=1; V<=E; V++){ for(int i=1; i<=n;i++){ if(V - w[i] < 0) break; F[V] = min(F[V], F[V-w[i]] + 1); } } ret = 1; while(F[ret] <= K) ret++; return ret-1; } int length; void dfs(int u){ if(u > N){ length = dp(w *K, u-1); if(length>Max){ Max = length; save = w; } return ; } for(w[u]=dp(w[u-1]*K, u-1)+1;w[u]>w[u-1];w[u]--) dfs(u+1); } void solve(){ w[1] = 1; dfs(2); printf("%d",save[1]); for(int i=2;i<=N;i++) printf(" %d",save[i]); printf("\nMAX=%d\n",Max); } int main() { scanf("%d %d",&K,&N); for(int i=0;i<=N;i++){ save.push_back(0); w.push_back(0); } solve(); return 0; }
相关文章推荐
- 采用首次适应算法的动态分区分配模拟
- 黑马程序员————Java基础日常笔记---IO其他流
- RelativeLayout的常用属性
- delphi中pos和Ansipos函数的区别
- 小胖说事32-----iOS关于block使用的5点注意事项
- 用timer控件实现sleep效果
- Unity3D 5.0版本 加载dll报错, 换用4.5 版本可以正确运行与导出(x86版本)
- Spring.Net Aop 学习
- AJAX JQuery 调用后台方法返回值(不刷新页面)
- ORACLE日期时间函数大全
- mfc窗口创建的create与oncreate
- LeetCode 8 String to Integer (atoi)
- 初次使用keepalived应该注意的
- cocoapods的各种坑
- 百度地图2.4.1SDK监听覆盖物的点击事件
- python getopt使用
- 分布式网站架构后续:zookeeper技术浅析
- ZooKeeper监控
- 20150722---点击按钮使指定的控件可见部分平移(JS)
- nginx配置多个虚拟主机,只有其中某个有作用