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] .根 ...
随机推荐
- javaNIO的总结
放大1.5倍查看 使用NIO对文件进行COPY操作 public class TestNIOCopyFile { public static void main(String[] args) thro ...
- scrapy选择器归纳
python 爬虫: srcrapy框架xpath和css选择器语法 Xpath基本语法 一.常用的路径表达式: 表达式 描述 实例 nodename 选取nodename节点的所有子节点 //div ...
- GUI:GUI的方式创建/训练/仿真/预测神经网络—Jason niu
(1)导入数据:点击最左底部Import 按钮 (2)创建模型network_Jason_niu:点击底部的New按钮 (3)设置参数并训练:点击底部的Open按钮 (4)仿真预测: 大功告成!
- HDU 4185 Oil Skimming 【最大匹配】
<题目链接> 题目大意: 给你一张图,图中有 '*' , '.' 两点,现在每次覆盖相邻的两个 '#' ,问最多能够覆盖几次. 解题分析: 无向图二分匹配的模板题,每个'#'点与周围四个方 ...
- hdu 3001 Travelling (三进制)【状压dp】
<题目链接> 题目大意: 给出n个点和m条边,求经过所有点所需的最小花费,每个点最多经过两次. 解题分析: TSP问题类型,由于此题每个点有三种状态,所以采用三进制状态压缩,0.1.2 分 ...
- 实现简单的web框架
实现简单的web框架 流程: 服务端启动---服务端等待请求---客户端访问---服务端响应请求 代码: from wsgiref.simple_server import make_server # ...
- 合并排序 java
java 实现合并排序 package How; import java.io.BufferedReader; import java.io.BufferedWriter; import java. ...
- Java中的位运算符
Java提供的位运算符有:左移( << ).右移( >> ) .无符号右移( >>> ) .位与( & ) .位或( | ).位非( ~ ).位异或( ...
- Spring使用笔记(二)Bean装配
Bean装配 Spring提供了3种装配机制: 1)隐式的Bean发现机制和自动装配 2)在Java中进行显示装配 3)在XML中进行显示装配 一)自动化装配 1.指定某类为组件类: @Compone ...
- php include 绝对路径 dirname(__FILE__)
include(dirname(__FILE__)."/PHPMailer/function.php");