博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOIP1999邮票面值设计[搜索|DP]
阅读量:6296 次
发布时间:2019-06-22

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

题目描述

给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1~MAX之间的每一个邮资值都能得到。

例如,N=3,K=2,如果面值分别为1分、4分,则在1分~6分之间的每一个邮资值都能得到(当然还有8分、9分和12分);如果面值分别为1分、3分,则在1分~7分之间的每一个邮资值都能得到。可以验证当N=3,K=2时,7分就是可以得到的连续的邮资最大值,所以MAX=7,面值分别为1分、3分。

输入输出格式

输入格式:

2个整数,代表N,K。

输出格式:

2行。第一行若干个数字,表示选择的面值,从小到大排序。

第二行,输出“MAX=S”,S表示最大的面值。

输入输出样例

输入样例#1:
3 2
输出样例#1:
1 3MAX=7 -------------------------------------------------------- 直接上正解吧 好像都是先想到递推,灰哥推了半节课... 不确定因素太多,并且是最优化问题,搜索 肯定是dfs枚举每张邮票的面值了,但是没有明显的上界啊 发现,若当前连续值最大到mxi,则下一张邮票最大可以是mxi+1,再大就会在mxi+1位置上空缺,没有意义了 那么问题就是如何在每一个dfs里找到当前最大连续值----背包DP f[i]表示到达i这个价值的最少邮票数,递推,一旦>n马上break WARN:一开始TLE了连个点,结果竟然是把价值最大值V设的太大,改成1e3就过了,下次一定要先跑一下最大价值可能是多少
#include
#include
#include
#include
using namespace std;const int N=45,V=500,INF=1e7;int n,k,f[V],ans=0,a[N],b[N];void dfs(int now){ for(int i=0;i
n) break; } mxi--; if(mxi>ans){ ans=mxi; for(int i=1;i<=n;i++) b[i]=a[i]; } if(now==k+1) return; for(int i=a[now-1]+1;i<=mxi+1;i++){ a[now]=i; dfs(now+1); }}int main(){ cin>>n>>k; a[1]=1; dfs(2); for(int i=1;i<=k;i++) cout<
<<" "; cout<<"\n"; cout<<"MAX="<
 

 

 

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

你可能感兴趣的文章
初探Angular6.x---进入用户编辑模块
查看>>
计算机基础知识复习
查看>>
【前端词典】实现 Canvas 下雪背景引发的性能思考
查看>>
大佬是怎么思考设计MySQL优化方案的?
查看>>
<三体> 给岁月以文明, 给时光以生命
查看>>
Android开发 - 掌握ConstraintLayout(九)分组(Group)
查看>>
springboot+logback日志异步数据库
查看>>
Typescript教程之函数
查看>>
Android 高效安全加载图片
查看>>
vue中数组变动不被监测问题
查看>>
3.31
查看>>
类对象定义 二
查看>>
收费视频网站Netflix:用户到底想要“点”什么?
查看>>
MacOS High Sierra 12 13系统转dmg格式
查看>>
关于再次查看已做的多选题状态逻辑问题
查看>>
动态下拉菜单,非hover
查看>>
政府安全资讯精选 2017年第十六期 工信部发布关于规范互联网信息服务使用域名的通知;俄罗斯拟建立备用DNS;Google打击安卓应用在未经同意情况下收集个人信...
查看>>
简单易懂的谈谈 javascript 中的继承
查看>>
iOS汇编基础(四)指针和macho文件
查看>>
Laravel 技巧锦集
查看>>