codevs 2033 邮票
洛谷 P2725 邮票 Stamps
codevs 2033 邮票
题目链接
http://codevs.cn/problem/2033/
https://www.luogu.org/problemnew/show/P2725
时间限制: 3 s 空间限制: 128000 KB
已知一个 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K —— 表示信封上能够贴 K 张邮票。计算从 1 到 M 的最大连续可贴出的邮资。
例如,假设有 1 分和 3 分的邮票;你最多可以贴 5 张邮票。很容易贴出 1 到 5 分的邮资(用 1 分邮票贴就行了),接下来的邮资也不难:
6 = 3 + 3
7 = 3 + 3 + 1
8 = 3 + 3 + 1 + 1
9 = 3 + 3 + 3
10 = 3 + 3 + 3 + 1
11 = 3 + 3 + 3 + 1 + 1
12 = 3 + 3 + 3 + 3
13 = 3 + 3 + 3 + 3 + 1
然而,使用 5 枚 1 分或者 3 分的邮票根本不可能贴出 14 分的邮资。因此,对于这两种邮票的集合和上限 K=5,答案是 M=13。
小提示:因为14贴不出来,所以最高上限是13而不是15
第 1 行: 两个整数,K 和 N。K(1 <= K <= 200)是可用的邮票总数。N(1 <= N <= 50)是邮票面值的数量。
第 2 行 .. 文件末: N 个整数,每行 15 个,列出所有的 N 个邮票的面值,每张邮票的面值不超过 10000。
第 1 行:一个整数,从 1 分开始连续的可用集合中不多于 K 张邮票贴出的邮资数。
5 2
1 3
13
说明
题目翻译来自NOCOW。
USACO Training Section 3.1
题目分析
具体分析参见https://www.cnblogs.com/huashanqingzhu/p/8408769.html
这里只写一点简洁的分析
这种递推方法原理是:对于某种要求构造的面额,判断它能否被题目给定面额整除,再寻找(1<=j<=i),使A[j]+A[i-j]值最小,求出凑成某种面额最少邮票数,
#include<iostream>
using namespace std; int K,N,i,j; //K是可用的邮票总数。N是邮票的种类数
int c[]; //各种邮票的面额
int a[]; //递推数组,a[i]表示构造i这个值需要的邮票数量
bool b1; void readfile() //读入数据
{
cin>>K>>N;
b1=true;
for(i=;i<=N;i++)
{
cin>>c[i];
if(c[i]==)b1=false;
}
}
void work()
{
if(b1==true) cout<<; //不存在面额1时输出无解
else
{
i=; a[i]=; //a[i]表示构造i这个值需要的邮票数量
do
{
i++;
for(j=;j<=N;j++)
if( (i%c[j]==)&&( (i/c[j])<a[i]||(a[i]==) ) )
a[i]=i/c[j]; //判断它能否被题目给定面额整除
for(j=;j<=i/;j++)
if(a[j]+a[i-j]<a[i])
a[i]=a[j]+a[i-j]; //寻找(1<=j<=i),使a[j]+a[i-j]值最小
}while((a[i]<=K)&&(a[i]!=));
cout<<i-; //输出
}
}
int main ( )
{
freopen("data.in","r",stdin);
readfile() ;
work();
return ;
}
这种算法极限情况下时间复杂度是10000*200*50以上,达到了10^8次方,运行时间会超时。
算法二
下面这个算法用m种面额邮票作循环,建立递推关系式:A[i]=min(A[i-C[j]]+1)。
#include<stdio.h>
#include<stdlib.h>
int a[]={},flag=;//a[i]表示第i种邮票的面额
int p[]={}; //p[i]表示构造i这个值需要的邮票数量
int main()
{
int N,K,i;
int ans=;
freopen("data.in","r",stdin); scanf("%d%d",&K,&N);//最多可以贴K张邮票。总共有N种不同的邮票
for(i=;i<N;i++)
{
scanf("%d",&a[i]);
if(a[i]==) flag=;
} if(flag==) {printf("");return ;}
do
{
ans++;
for(i=;i<N;i++)
{
if(ans-a[i]>=)
{
if(p[ans]==) p[ans]=p[ans-a[i]]+;
else if(p[ans]>p[ans-a[i]]+) p[ans]=p[ans-a[i]]+;
}
}
if(p[ans]== || p[ans]>K)
{ printf("%d",ans-); break; }
}while();
return ;
}
codevs 2033 邮票的更多相关文章
- 深搜+DP剪枝 codevs 1047 邮票面值设计
codevs 1047 邮票面值设计 1999年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description ...
- 邮票(codevs 2033)
题目描述 Description 已知一个 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K —— 表示信封上能够贴 K 张邮票.计算从 1 到 M 的最大连续可贴出的邮资. 例如,假设有 ...
- [NOIP1999提高] CODEVS 1047 邮票面值设计(dfs+dp)
dfs出邮票的各种面值,然后dp求解. ------------------------------------------------------------------------------- ...
- codevs 1047 邮票面值设计
/* 开始没啥好的思路 暴力吧 T的太严重 加了k>n的特判 结果没数据…..然后又暴力生成了几组答案 打表 然而有没有数据 华丽的爆零了 正解 回溯+DP 回溯生成k数组 然后DP找最优解更新 ...
- 洛谷P2725 邮票 Stamps
P2725 邮票 Stamps 37通过 224提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 为什么RE?在codevs上AC的. 题目背景 给一组 ...
- codevs 3289 花匠
题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1285 二叉查找树STL基本用法
C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
随机推荐
- for循环的简介及break和continue的区别
break和continue都是用来控制循环结构的,主要是停止循环. 1.break 有时候我们想在某种条件出现的时候终止循环而不是等到循环条件为false才终止. 这是我们可以使用break来完成. ...
- Scala-Unit4-Scala数组/集合
一.Scala数组 1.数组的定义: 方法一:val arr = new Array[String](3) String代表数据的元素类型.3表示数组的长度 方法二:val arr = Array[I ...
- C. A Mist of Florescence ----- Codeforces Round #487 (Div. 2)
C. A Mist of Florescence time limit per test 1 second memory limit per test 256 megabytes input stan ...
- 003.MySQL高可用主从复制新增slave
一 基础环境 主机名 系统版本 MySQL版本 主机IP master CentOS 6.8 MySQL 5.6 172.24.8.10 slave01 CentOS 6.8 MySQL 5.6 17 ...
- spring_AOP
例子代码 理解AOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程.大概意思就是在原有源代码的基础上,增加功能,而又不修改原有的代码. 术语 切面(Aspe ...
- BZOJ.3532.[SDOI2014]LIS(最小割ISAP 退流)
BZOJ 洛谷 \(LIS\)..经典模型? 令\(f_i\)表示以\(i\)结尾的\(LIS\)长度. 如果\(f_i=1\),连边\((S,i,INF)\):如果\(f_i=\max\limits ...
- JavaScript基础笔记(七)DOM
DOM DOM可以将任何HTML或者XML文档描述成一个由多层节点构成的结构. 一.节点层次 一)Node类型 DOM1定义了一个Node接口,该接口将由DOM中所有节点类型实现. 每一个节点都有一个 ...
- Max Factor 2710 最大的合数的质数因子
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2710 思路:用类似“埃氏筛法”求素数的方法 只是不在把合数标记为1 而是标记为他是因子数. 最后比较大小即 ...
- 简单配置umiJS学习笔记
最近跟着Antd-Pro官方教程学习umi,这里给大家推荐一下这个教程,特别适合初学者学习,教程涉及了AntD,AntD-Pro,umiJS,dvaJS等框架知识. 学习过程中跟着教程做了个Demo, ...
- 浅析webpack使用方法
webpack是一个网页模块打包工具,可以将所有代码.图片.样式打包在一起,除此之外还有许多实用的功能.最近看了一个慕课学习了一下webpack的使用,在这里做一下总结. 本文不会涉及太多深入的知识, ...