描述

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

[规模最大的一个点的时限是3s]

格式

PROGRAM NAME: stamps

INPUT FORMAT:

(file stamps.in)

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

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

OUTPUT FORMAT:

(file stamps.out)

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

SAMPLE INPUT

5 2
1 3

SAMPLE OUTPUT

13
分析:
简单DP题。水题浪费时间还是太多。。。
先说下思路:首先想到设b[i]表示i可不可以被表示,然后b[i]=b[i-a[0]] || b[i-a[1]] || ......b[i-a[j]]算出每个i,然后看最大连续的数到哪里。
后来发现这道题有个限制就是邮票最多只能用K张。所以简单换了下方程:设f[i]表示能贴出i需要的最少邮票数。b[i]的计算公式还是一样的,只不过要加上一个限制条件,f[i-a[j]]<K. ( j=0..N ) 但是这个方法有个缺陷,不知道把i算到哪里合适。当然这道题的最大可能是200*10000。
但马上就又可以想到一个更直接且更省空间的方法:1.根本不需要把b[i]记录下来。因为是求从1开始连续的,所以到我们算到的这个i为止,前面的数都是ok的。(即b[i]=1),所以算当前b[i]就可以利用前面的任何数。2.跳出条件,不需要非算到200*10000,一旦算的i不能贴出,则可以立刻跳出。并输出i-1。理由同上,因为题目是让求从1开始可以连续到最大的数。
代码:
/*
ID:138_3531
LANG:C++
TASK:stamps
*/#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include <climits>using namespace std;int f[2001000];//能贴出i需要的最少邮票数
int main()
{ifstream fin("stamps.in");ofstream fout("stamps.out");int i;int K,N;int ok;int min;int a[50];memset(f,0,sizeof(f));f[0]=1;fin>>K>>N;for (i=0;i<N;i++)fin>>a[i];for (i=1;;i++){ok=0;min=INT_MAX;for (int j=0;j<N;j++){if (i-a[j]>=0)if ((f[i-a[j]]<K+1)&&(f[i-a[j]]>0)){ok=1;if (f[i-a[j]]+1<min)min=f[i-a[j]]+1;}}if (!ok)break;f[i]=min;}fout<<i-1<<endl;return 0;
}

转载于:https://www.cnblogs.com/AbandonZHANG/archive/2012/07/14/2598262.html

USACO / Stamps(DP)相关推荐

  1. HDU 6249 Alice’s Stamps(dp)

    http://acm.hdu.edu.cn/showproblem.php?pid=6249 题意: 给出n个区间,求选k个区间的最大区间并. 思路: 可能存在左端点相同的多个区间,那么此时我们肯定选 ...

  2. 求三角形最大面积(DP)

    求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...

  3. LeetCode 编辑距离 II(DP)

    1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...

  4. LeetCode 1220. 统计元音字母序列的数目(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: - 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i ...

  5. LeetCode 265. 粉刷房子 II(DP)

    文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同. 当然,因为市场上不同颜色油 ...

  6. LeetCode 256. 粉刷房子(DP)

    文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成红色.蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其与相邻的两个房子颜色不能相同. 当然,因 ...

  7. LeetCode 1223. 掷骰子模拟(DP)

    1. 题目 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始 ...

  8. LeetCode 1155. 掷骰子的N种方法(DP)

    1. 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你 ...

  9. LeetCode 1139. 最大的以 1 为边界的正方形(DP)

    1. 题目 给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量.如果不存在,则返回 0. 示例 1: 输入:grid ...

最新文章

  1. activity 的属性android:taskAffinity和android:allowTaskReparenting
  2. 【统计学习方法】K近邻对鸢尾花(iris)数据集进行多分类
  3. Google浏览器导出书签
  4. GDI+中发生一般性错误
  5. 使用范型观察者模式观察多个数据的实现
  6. TcpClient 有好多坑
  7. mac 更换默认蓝牙适配器_Win7连接低功耗蓝牙(BLE)鼠标
  8. 阿里云、天津开启多项合作,区域经济大脑落地津南
  9. jQuery判断浏览器是移动端还是电脑端自动跳转
  10. TCP/UDP测试工具大全
  11. FusionChartsFree例子
  12. Nik插件滤镜套装Nik Collection 3 Mac
  13. 灵境(元宇宙) 赋能传统产业创新的理论方法与架构模式
  14. 《深度学习之美》推荐序:通俗也是一种美德
  15. Excel技巧之插入图表
  16. Java学习之面向对象
  17. fflush函数作用浅析
  18. IDA*算法实现的数字拼图游戏
  19. 和机器学习和计算机视觉相关的数学
  20. Java面向对象程序设计(抽象类和接口-----)

热门文章

  1. 如何在Windows 2000的域环境中自动分发软件
  2. 正态分布随机数 C语言,C语言产生满足正态分布的随机数
  3. ASIC设计的一些软件
  4. 垃圾邮件过滤 php,垃圾邮件过滤功能
  5. 批量计算多个点到一个点的距离
  6. 牛客华为机试第3题python
  7. opencv-python实现马赛克油画漫画风格的图片
  8. 一步一步学Silverlight 2系列(9):使用控件模板
  9. double转换为int以及浮点型相加损失精度问题
  10. Git中忽略文件权限或文件拥有者的改变