codeup22345  邮票问题

时空限制    1000ms/128MB

题目描述

给定一个信封,最多只允许粘贴N(N<=100)张邮票,我们现在有m(m<=100)种邮票,面值分别为:x1,x2,…….xm分(xi<=255,为正整数),并假设各种邮票都有足够多张.

要求计算所能获得的邮资最大范围,即求最大值MAX,使在1—MAX之间的每一个邮资值都能得到.

例如:N=4,有2种邮票,面值分别为1分,4分,于是可以得到1----10分,和12分,13分,16分的邮资,由于不能得到11分和15分,所有邮资的最大范围是MAX=10.

输入

从键盘输入一个文本文件的文件名,该文件第1行为最多粘贴的邮票数N;第2行为邮票种数m,以下m行各有一个数字,表示邮票的面值xi.

输出

1.       若最大范围为空,则在屏幕上输出MAX=0

2.       若最大范围不为空,则把结果输出到屏幕上.

样例输入

4
2
1
4

样例输出

MAX=10

分析

本题可以看成是一个集合问题,即求在贴的邮票不多于n张的可满足条件的邮资集。

集合问题的关键在于判定元素是否在集合中,对于本题而言,是判断某个邮资是否在贴不多于n张邮票可满足。

这个判断问题可以用递归的方法解决。

设当前考虑的邮资值为maxv,最多允许贴n张邮票,记为(maxv,n).如果首先贴一张面值为xi的邮票,那么剩下的问题是(maxv-xi,n-1)的问题。如果(maxv-xi,n-1)可解,那么(maxv,n)问题也可解。

进一步, 这个递归的算法可以转化为递推的算法来解决。设f[value]表示邮资为value时所需最少的邮票数,f[maxv]=min{f[maxv-x[i]]+1}。当f[value]<=n时,问题(maxv,n)可解,否则无解。

递推算法可以描述为:

for (int i=1; i<=m; i++)if (maxv>=x[i]){        //能贴第i张邮票if (f[maxv]==0) f[maxv]=f[maxv-x[i]]+1;    //没有贴if (f[maxv]>f[maxv-x[i]]+1) f[maxv]=f[maxv-x[i]]+1;    //贴少的}

以样例数据为例:

value

f[value]

0

0

1

min{f[1-1]+1}=1

2

min{f[2-1]+1}=2

3

min{f[3-1]+1}=3

4

min{f[4-1]+1,fs[4-4]+1}=1

5

min{f[5-1]+1,fs[5-4]+1}=2

6

min{f[6-1]+1,fs[6-4]+1}=3

7

min{f[7-1]+1,fs[7-4]+1}=4

8

min{f[8-1]+1,fs[8-4]+1}=2

9

min{f[9-1]+1,fs[9-4]+1}=3

10

min{f[10-1]+1,fs[10-4]+1}=4

11

min{f[11-1]+1,fs[11-4]+1}=5  (>4)

代码

#include<iostream>
using namespace std;
const int M = 105, N = 25600;
int x[M],f[N]={0};    //f[i]  为面额为i所贴邮票最少张数int main(){int n,m,maxv=0;cin>>n>>m;for (int i=1; i<=m; i++) cin>>x[i];while (1){maxv++;        //邮票面额for (int i=1; i<=m; i++)if (maxv>=x[i]){        //能贴第i张邮票if (f[maxv]==0) f[maxv]=f[maxv-x[i]]+1;    //没有贴if (f[maxv]>f[maxv-x[i]]+1) f[maxv]=f[maxv-x[i]]+1;    //贴少的}if (f[maxv]==0 || f[maxv]>n){    //达不到面值,或超过了能贴的邮票总数cout<<"MAX="<<maxv-1<<endl;return 0;}}
}

codeup22345 邮票问题相关推荐

  1. 生成对抗网络的背景与意义_生成对抗网络的意义

    生成对抗网络的背景与意义 为什么我们需要生成对抗网络:-(Why do we need Generative Adversarial Network: -) If we show a lot and ...

  2. usaco ★Stamps 邮票

    ★Stamps 邮票 已知一个 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K -- 表示信封上能够贴 K 张邮 票.计算从 1 到 M 的最大连续可贴出的邮资. 例如,假设有 1 分和 ...

  3. 核心板焊接之连接器与邮票孔

    1.焊接,连接器好操作,但是邮票孔要考虑第一次焊接可能会有损耗,需要调整合适的炉温曲线,另外邮票孔焊接可能会有一定的不平的角度,如翘曲度. 2.维护方面,有问题的板子拆卸核心板需要专业的设备,邮票孔比 ...

  4. 前端每日实战:143# 视频演示如何用 CSS 的 Grid 布局创作一枚小松鼠邮票

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/YOoXpv 可交互视频 此视频是可 ...

  5. BZOJ 1426 收集邮票 ——概率DP

    $f(i)$表示现在有$i$张,买到$n$张的期望 所以$f(i)=f(i+1)+\frac {n}{n-i}$ 费用提前计算,每张邮票看做一元,然后使后面每一张加1元 $g(i)$表示当前为$i$张 ...

  6. 算法提高 邮票面值设计

    算法提高 邮票面值设计 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤13)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮 ...

  7. codevs 1047 邮票面值设计

    ( 时间限制: 1 s  空间限制: 128000 KB) 题目描述 Description 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定所有的邮票数量都足够 ...

  8. 洛谷P4550 收集邮票(概率期望)

    传送门 神仙题啊--这思路到底是怎么来的-- ps:本题是第$k$次买邮票需要$k$元,而不是买的邮票标号为$k$时花费$k$元 我们设$g[i]$表示现在有$i$张,要买到$n$张的期望张数,设$P ...

  9. UVa 242 邮票和信封(完全背包)

    https://vjudge.net/problem/UVA-242 题意: 输入s(每个信封能粘贴的最多邮票数量)和若干邮票组合,选出最大连续邮资最大的一个组合(最大连续邮资也就是用s张以内的邮票来 ...

最新文章

  1. RabbitMQ安装与初始配置
  2. 小强系列之大话移动测试
  3. C#LeetCode刷题之#599-两个列表的最小索引总和​​​​​​​​​​​​​​(Minimum Index Sum of Two Lists)
  4. Windows Phone7 手机越狱教程
  5. 如何从程序中改变音量?
  6. Exchange Server2010系列之五:再谈邮箱基本管理
  7. Android Error: Program sh not found in PATH 解决方法
  8. org.n3r.idworker idworker-client生成唯一id
  9. 天翼云搭建socks5和搭建http
  10. 硬件工程师为什么远不如软件工程师?
  11. android 平板怎么截图,小米平板4怎么截图 小米平板4截屏的三种方法
  12. 【菜鸟C++学习杂记】ASCII码转换和显示
  13. 电源管理芯片LDO(Low Dropout Regulator)分析1
  14. 数据库批量插入和存在的问题
  15. 图片上的文字用CSS写出毛玻璃效果
  16. 读书笔记:普通心理学之个体心理
  17. redis安装和基本数据类型
  18. 不同类型怎么选择服务器
  19. 销售人员如何打电话?
  20. web前端与后台数据交互

热门文章

  1. 网络项目改造的大致流程
  2. 非接触式图像测量仪“快、准、易”,有效解决人为误差
  3. 关于AD提示some nets were not able to matched
  4. django mysql视图_Django框架使用mysql视图操作示例
  5. 使用node搭建后台管理系统(1)
  6. win7搭建WAMP环境
  7. 如何从一个大项目中,迅速的定位执行速度慢的语句. (定位慢查询)
  8. 深圳蚂蚁搬家公司 深圳搬家
  9. html中怎么写播放音乐格式,HTML+CSS入门 如何实现多浏览器播放wav格式的音频文件...
  10. 如何快速提升网站权重?7年SEO从业经验给你谈快速上权重方法