洛谷 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 ;
}

最新文章

  1. JavaScript之web通信
  2. Visual Studio Code 1.0发布,支持中文在内9种语言
  3. entityframework学习笔记--004-无载荷与有载荷关系
  4. 时间戳 JavaScript parse() 方法 处理技巧
  5. ConCurrent in Practice小记 (3)
  6. emberjs重写补充类之reopen方法和reopenClass方法
  7. redis.conf的配置
  8. MYSQL小常识
  9. n数码问题, 全排列哈希
  10. android 中动画
  11. 概率图论PGM的D-Separation(D分离)
  12. 动态引入javascript
  13. 消息中间件kafka+zookeeper集群部署、测试与应用
  14. Django_ORM操作 - 查询
  15. Managing Large State in Apache Flink&#174;: An Intro to Incremental Checkpointing
  16. 使用百度的富文本编辑器UEditor遇到的问题总结
  17. flex和box-shadow一些兼容性问题
  18. HttpWebRequest抓取网页内容与直接输入URL得到的内容不一致!球大神帮忙!!
  19. Windows XP Manifest in Delphi
  20. json如何把键名作为变量?

热门文章

  1. Raspberry 音乐播放器omxplayer安装
  2. Python做性能测试-1、Locust基础篇
  3. HDU 1054 Strategic Game (最小点覆盖)【二分图匹配】
  4. 001. Ansible简介
  5. 前端之HTML(一)
  6. Java 实现String语句的执行(Jexl)
  7. PhantomJS在Selenium中被标记为过时的应对措施
  8. 项目部署相关命令(pm2)
  9. c#接口与抽象类的区别(一)
  10. CODEVS 2455 繁忙的都市 SCOI2005(洛谷 P2330)