http://qingtangpaomian.iteye.com/blog/1635988

一. 题目翻译
1. 描述:
  已知一个 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]
小提示:因为14贴不出来,所以最高上限是13而不是15

2. 格式:

INPUT FORMAT:

第 1 行: 两个整数,K 和 N。K(1 <= K <= 200)是可用的邮票总数。N(1 <= N <= 50)是邮票面值的数量。
第 2 行 .. 文件末: N 个整数,每行 15 个,列出所有的 N 个邮票的面值,每张邮票的面值不超过 10000。

          OUTPUT FORMAT:

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

3. SAMPLE:

          SAMPLE INPUT:
5 2
1 3

          SAMPLE OUTPUT:
13
          

二.  题解
1. 题意理解(将问题分析清楚,大致用什么思路):
这道题目还是可以使用动态规划的,我们使用一个数组needs[i]表示产生面值为i的邮资需要的最少的邮票数量。然后遍历needs[i],如果needs[i]大于我们输入的最大可使用的邮票数量,则输出i-1为满足要求的最大面值。
2. 具体实现(具体实现过程中出现的问题):
状态转移方程如下needs[i] = min {needs[i] , needs[i-prize[k]]+1}(k=1..N)。具体实现请参考代码。
package session_3_1_6;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Scanner;public class stamps {public static void main(String[] args) throws Exception {
//      Scanner in = new Scanner(System.in);
//      PrintWriter pw = new PrintWriter(System.out);Scanner in = new Scanner(new BufferedReader(new FileReader("stamps.in")));PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("stamps.out")));int K = in.nextInt();int N = in.nextInt();int[] needs = new int[2000000]; //动态规划用数组 , needs[i]表示产生面值为i的邮资所用的最少的邮票数量。int[] stamps = new int[N]; //输入提供的各种邮票的面值Arrays.fill(needs, Integer.MAX_VALUE);for (int j=0;j<N;j++){stamps[j] = in.nextInt();}int i = 0;needs[0] = 0;for (;needs[i]<=K;){i++;for (int j=0;j<stamps.length;j++){if (stamps[j]<=i){needs[i] = min(needs[i] ,needs[i-stamps[j]]+1); //状态转移方程}}}pw.println(i-1);pw.close();}public static int min(int a , int b){return a<b?a:b;}}

下面是上面题的升级版

http://sfiction.blog.163.com/blog/static/1994040102012520113738298/

给定一个信封,最多只允许粘贴N张邮票,计算在给定K种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大max,使得1-max之间的每一个邮资值都能得到。
   例如,N=3,K=2,如果面值分别为1分、4分,则在l分-6分之间的每一个邮资值都能得到(当然还有8分、9分和12分):如果面值分别为1分、3 分,则在1分-7分之间的每一个邮资值都能得到。可以验证当N=3,K=2时,7分就是可以得到连续的邮资最大值,所以max=7,面值分别为l分、3 分。
[数据范围]
100%的数据,N + K <= 14

这道题真是混蛋……开始是动态规划没写全WA了两次,修正以后无数2B错误连WA三次,唯一的欣慰就是最优解排在第七。
DFS+DP。DFS枚举所有可能的构造方式,用背包解决0..M的面值用当前邮票凑出的最小代价。

/*
ID: Sfiction
OJ: RQNOJ
PROB: 112
*/
#include <stdio.h>
#define M 500
int a[20],f[M],ans[20];
int N,K,MAX,g=1<<29;
void DFS(int k,int s)
{int i,j,t[M];if (k==K){if (s>=MAX)for (MAX=s,i=1;i<=K;i++) ans[i]=a[i];return;}for (i=0;i<M;i++) t[i]=f[i];for (i=a[k]+1;i<=s;i++){for (j=0;j<M-i;j++)if (f[j]+1<f[j+i]) f[j+i]=f[j]+1;for (j=s;f[j]<=N;j++);a[k+1]=i;DFS(k+1,j);for (j=0;j<M;j++) f[j]=t[j];}
}
int main()
{int i;scanf("%d%d",&N,&K);a[1]=1;for (i=1;i<=N;i++) f[i]=i;for (;i<M;i++) f[i]=g;DFS(1,N+1);for (i=1;i<=K;i++) printf("%d ",ans[i]);printf("\nMAX=%d",MAX-1);return 0;
}

USACO - 3.1.6 - Stamps相关推荐

  1. 学校作业-Usaco DP水题

    好吧,因为USACO挂掉了,所以我写的所有代码都不保证正确性[好的,这么简单的题,再不写对,你就可以滚粗了! 第一题是USACO 2.2.2 ★Subset Sums 集合  对于从 1 到 N 的连 ...

  2. usaco ★Stamps 邮票

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

  3. USACO / Stamps(DP)

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

  4. 【USACO题库】 动态规划 汇总(普及-/普及)

    数据结构提高是够用了=-=虽然树状数组没学 但是其他类问题只能打到普及 普及啊啊啊!!! 而且这边省选组都是什么仙人掌啊,什么系什么点对啊...感觉数据结构并没有什么用 (实际上很有用但我不会用就是了 ...

  5. WOJ 1037 邮票 Stamps

    WOJ 1037 邮票 Stamps 1 题目 1.1 输入 1.2 输出 1.3 样例 1.4 来源 2 分析 2.1 70分(TLE) 2.2 正解 3 注意 3.1 初始化 3.2 找答案 1 ...

  6. usaco Shaping Regions

    这就是usaco 前面的windows area的变形. /* ID:jinbo wu TASK:rect1 LANG:C++ */ #include<iostream> #include ...

  7. usaco Postal Vans(dp)

    是哈密顿回路,然后...就不知道怎么写了 ,以前写过类似的不过情况没这么多也没这么复 usaco training 6.1.1 Postal Vans 题解 标签: usaco training题解d ...

  8. usaco Beef McNuggets

    这两天贼烦,ccf炸了,还有一个烦心事.哎我都不知道自己能不能坚持下去了.马上期末考了.这段时间还是抓紧时间复习吧同时刷usaco的节奏要跟以前一样了,毕竟课少了. 题解: 只要你知道以下的数论结论, ...

  9. usaco前两章小结

    usaco 暑假老师有推荐做但是那个题目太长了,而且·大部分都是废话做起来特别慢,而且当时自己基本上什么都不懂,太难了所以看了题解做了两题就放弃了. 转眼就上学了,因为想学习acm所以就胡乱找题做但是 ...

最新文章

  1. 关于301跳转的多种办法
  2. BZOJ1008: [HNOI2008]越狱(组合数)
  3. Mapgis6.7 林相图自动注记 .
  4. Qt工作笔记-可拖动大小的QListWidget(自定义控件方式)
  5. Stack Usage on Transfers to Interrupt and Exception Handling Routines
  6. Mac怎么终端配置mysql_mysql mac怎么在终端安装
  7. Java中try与catch的使用
  8. 什么是LED屏/ThinkPadX200/X200S/X301/T400/T500等那些是LED屏?
  9. 老笔记本_Win7_U盘_ReadyBoost
  10. 关于多元正态分布向量表示的Notation问题
  11. 太赞了,英伟达又一突破,输入关键词就可以生成直逼摄影师的大片
  12. FOTOO-疫情下,企业如何线上组织活动,输出企业文化
  13. 高并发核心技术Redis系列(九)--------本地操作
  14. GIS小白教程:如何利用高程DEM数据构建三维地图模型(基于ArcScene)
  15. 数据库SQL实践25:获取员工其当前的薪水比其manager当前薪水还高的相关信息
  16. 从西刺代理爬取代理ip,并验证是否可用
  17. 锅炉给水用碳酸钠调PH值与氢氧化钠调PH值优劣势对比
  18. 高性能网络编程总结及《TCP/IP Sockets编程(C语言实现) (第2版)》 代码下载(链接以及文件打包)
  19. raid卡缓存对硬盘性能_我们怎么解决机械硬盘既慢又容易坏的问题
  20. vs 给qt程序添加图标

热门文章

  1. 英语在线听力翻译器_仁爱版初一英语免费听力训练电子教程
  2. listView分批和分页加载数据
  3. django model
  4. 博士申请 | 南洋理工大学骆思强老师招收大数据/机器学习方向博士生、博士后...
  5. 重磅发布!最新版《动手学深度学习》PDF 版今天终于可以下载
  6. 图像压缩哪家强?请看这份超详细对比
  7. java第五章抽象类与接口5.1-5.3 2020.3.27+31
  8. HDU 1069 Monkey and Banana 最长上升子序列进阶(动态规划)
  9. mac php 怎么启动命令,Mac 使用homebrew启动PHP环境命令
  10. ps ico插件_常用 PS 插件合集(1)