洛谷 P2725 邮票 Stamps

codevs 2033 邮票

题目链接

http://codevs.cn/problem/2033/

https://www.luogu.org/problemnew/show/P2725

时间限制: 3 s  空间限制: 128000 KB

题目描述 Description

已知一个 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

输入描述 Input Description

第 1 行: 两个整数,K 和 N。K(1 <= K <= 200)是可用的邮票总数。N(1 <= N <= 50)是邮票面值的数量。

第 2 行 .. 文件末: N 个整数,每行 15 个,列出所有的 N 个邮票的面值,每张邮票的面值不超过 10000。

输出描述 Output Description

第 1 行:一个整数,从 1 分开始连续的可用集合中不多于 K 张邮票贴出的邮资数。

样例输入 Sample Input
5 2
1 3
样例输出 Sample Output

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 邮票的更多相关文章

  1. 深搜+DP剪枝 codevs 1047 邮票面值设计

    codevs 1047 邮票面值设计 1999年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description ...

  2. 邮票(codevs 2033)

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

  3. [NOIP1999提高] CODEVS 1047 邮票面值设计(dfs+dp)

    dfs出邮票的各种面值,然后dp求解. ------------------------------------------------------------------------------- ...

  4. codevs 1047 邮票面值设计

    /* 开始没啥好的思路 暴力吧 T的太严重 加了k>n的特判 结果没数据…..然后又暴力生成了几组答案 打表 然而有没有数据 华丽的爆零了 正解 回溯+DP 回溯生成k数组 然后DP找最优解更新 ...

  5. 洛谷P2725 邮票 Stamps

    P2725 邮票 Stamps 37通过 224提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 为什么RE?在codevs上AC的. 题目背景 给一组 ...

  6. codevs 3289 花匠

    题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...

  7. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  8. codevs 1285 二叉查找树STL基本用法

    C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...

  9. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

随机推荐

  1. Mybatis关联一对多映射不能查询出所有的数据的问题

    在使用Mybatis进行一对多查询时,如果返回的是一个对象的话,可以发现将一对多的数据全都取出来了,但是这样的缺点是有很多值为null,我们更喜欢将返回值设为Map的形式,这样可以去除那些多余null ...

  2. Java实现Windows、Mouse监听器

    1.通过实现WindowListener接口来实现Windows监听器: import java.awt.event.WindowEvent; import java.awt.event.Window ...

  3. C++学习之 —— 输入输出

     案例:输入任意空格和数字,输出其中的数字之和. #include <iostream> using namespace std; int main() { ; cout << ...

  4. SQL-内连接、外连接(左、右)、交叉连接

    本文测试基于以下两个表,student(左) \ teacher(右),使用数据库MariaDB,图形化界面HeidiSQL. 连接查询的概念:根据两个表或多个表的列之间的关系,从这些表中查询数据,即 ...

  5. SpringBoot使用数据库

    这一篇简单介绍一下SpringBoot配置数据库的配置(依赖和application.properties),以下全是以本地数据库为例子,具体用户名密码地址都根据实际去修改. Mysql数据库: po ...

  6. 在Node.js使用Promise的方式操作Mysql

    最近在学习Node.js,虽然早就听说了回调地狱结果过了一周就遇到了.所以花时间学习了了一下Promise.虽然还有Async/await.co.生成器等选择,但是因为本人基础较差,以及时间问题所以决 ...

  7. luffy项目的接口开发

    处理跨域请求 主要的思路: 设置一个基于CORS的中间件来处理,关于跨域的产生与处理手段 settings.py: MIDDLEWARE = [ 'django.middleware.security ...

  8. php回话控制 cookie

    <?php class CustomCookie{ static private $_instance = null; private function __construct(array $o ...

  9. vue的生存周期

    钩子函数 created 实例已经创建 befoCompile 编译之前 compiled 编译之后 ready 插入到文档 beforeDestroy 销毁之前 destroyed 销毁之后

  10. LeetCode Weekly Contest 32

    581. Shortest Unsorted Continuous Subarray Given an integer array, you need to find one continuous s ...