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] .根 ...
随机推荐
- Mysql乐观锁与悲观锁
乐观锁和悲观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常重要的基础理念. Mysql的悲观锁 什么是悲观锁(Pessimistic Lock): 悲观锁的特点是先获取锁,再进行业务操作,即 ...
- php(apache)切换版本
php(apache)切换版本 1.brew link php@7.1 2.上两行写入 ~/.bash_profile文件 3.source ~/.bash_profile 4.sudo vi /et ...
- Python编程基础[函数和面向对象](三)
Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也 ...
- 【python】异步IO
No1: 协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行. 优势: 1.最大的优势就是协程极高的执行效率.因为子程序切换不是线程切换,而是 ...
- Linux命令集
系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...
- .net(二)
1.维护数据库的完整性.一致性.你喜欢用触发器还是自写业务逻辑?为什么? 答:尽可能用约束(包括CHECK.主键.唯一键.外键.非空字段)实现,这种方式的效率最好:其次用触发器,这种方式可以保证无论何 ...
- [Python]list.append字典的时候,修改字典会导致list内容变化的问题
今天写了这样的一段代码,出现了BUG. log_message["EventName"] = "上架->可用" log_message["Eve ...
- django rest_framework 序列化组件详解
为什么要用序列化组件 当我们做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到 ...
- DWM1000 定位数据收发以及定位算法
蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: DWM1000 定位数据 官方定位程序,建议先学习基础API程序 参考手册: 在手册上提到,目前双向定 ...
- React入门——制作一个TodoList App
源码 import React, { Component, Fragment } from "react"; class TodoList extends Component { ...