http://www.stubc.com/thread-2117-1-1.html
问题重述:
给出n种邮票,每种邮票有自己的面值(面值可能重复)
指定m种“总面值”,对每种“总面值”,求解满足如下条件的组合以达到该“总面值”
(1) 所用邮票在n种中可以重复选取
(2) 所用邮票张数〈=4
(3) 尽量多的适应那个不同总类的邮票 Max (Stamp Types)
(4) 若有多种方案满足(3),则选取张数最小的一种方案 Min (Stamp Num)
(5) 若有多种方案满足(3)(4),则选取“最大面额”最高的一种方案。 Max(Heightest Value)
(6) 若有多种方案满足(3)(4)(5) 则输出 “tie”
题目
分析:
(1) 算法
定位:
从题目的条件可知,此题必须遍求所有方案以求解,因此采用搜索
的方法是非常合理的,因为题目带由一定的递推性,也可以尝试动态规划的方法.
(2) 问题优化
与简化
对于搜索型题目,关键的优化就是减少重复计算,本题可由3方面的简化,避免重复性计算.
(1) 对于面额相等的邮票,可以限制在1~5张,多余的可以不处理,例如这样的输入:
1 1 1 1 1 1 1 1 0 8个1
4 0
可以简化成为:
1 1 1 1 1 0 5个1
4 0
他们的解是相同的
(2) 搜索求解时约定, 后一张邮票面额>=前面张邮票的面额,即如下的6种情况:
1 2 3 2 3 1 3 12 1 3 2 3 2 1 2 1 3
只需搜索判断一种,即 1 2 3 的情况
(3) 对于给定的n种邮票,遍历4张邮票的所有可达“总面额”的解,当m种指定面额给出,只需插标输出即可,不需要重复m次类似的搜索。(因为m次的搜索中,很多是重复计算的)
(3)算法介绍
(1) 搜索方法一: (base on 史诗’s program)
主要思路:
4重循环,枚举所有可能,依据题目条件保留最优解。
For(i=1;i<=total_stamps;i++)
For(j=i;j<=total_stamps;j++)
For(k=j;k<=total_stamps;k++)
For(l=k;l<=total_stamps;l++)
{
更新最优解
}
优化:
使用优化方案(1)(2), 修改后可以加上优化方案(3)
评价:
编程
复杂度低,代码
少,运行时空效率
高,比赛时候推荐
使用
但是扩展性受限制,若题目给的是任一k张而不是4,则必须大量修改代码
(2) 搜索方法二: (base on hawking’s program)
主要思路:
递归深度搜索,遍历所有k张邮票的可达面额的解,保留每种面额的最优
解,查表输出指定面额的解,并给定k=4,即为题目要求的情况。
Void Solve(int
deep)
{
更新当前方案所达面值的最优解
if (deep>4) return;
for(int s=now[deep-1];s<=total_stamp;s++)
{
now[deep]=s;
solve(deep+1);
}
}
优化:
使用优化方案(1)(2)(3)进行截枝
评价:
深度搜索的经典
模板
程序
,推荐学习
,几乎所有的搜索都可以套用的模板
编程复杂度中,运行时空效率高,通用性强一些,但代码可能稍为多一些
(3) 动态规划: (base on my program)
主要思路:
定义
:int anstype[k][j] 表示:
用前k种邮票,选i张,达到面额为j,最多用多少种不同的类型
邮票。
定义:bool tied[k][j] :
k,i,j 定义如上,tied 表示 anstype[k][j] 的最优值是否有多种方案.即同时满足题目的条件(3)(4)时是否多种
定义:bool anstied[k][j] :
由于 tied 限制不够强,必须多一个anstied 表示同时满足条件(3)(4)(5)是否有多种方案
递推关系:
(1)
anstype[k][j]=Max{anstype[k-1][i-w][j-w*value[k]]+1} 1<=w<=4, i-w>0, j-w*value[k]>=0
(2)
在anstype 的更新最大值的同时,可以判断,若某个w 使得
anstype[k][j]==anstype[k-1][i-w][j-w*value[k]]+1 则
tied[k][j]=ture;
anstype[k][j]<anstype[k-1][i-w][j-w*value[k]]+1 则
tied[k][j]=false
(3)
至于anstied 可以这样求得:
anstype[k][j]<anstype[k-1][i-w][j-w*value[k]]+1时
anstied[k][j]=tied[k-1][i-w][j-w*value[k]]
anstype[k][j]==anstype[k-1][i-w][j-w*value[k]]+1时
anstied=true;
主要优化:
使用优化方案(1)(2)(3)
空间优化,由于[k][j]只与[k-1][j]有关,所以只需2维数据
[j]就可以了
这是动态规划最常用的空间优化,另外的一些是压缩存储技巧
,主要的是用位运算存储,本题没有用上,不过以后有些题目会常用。
评价:
编程复杂度 中,运行时间少,可以承受大规模数据,规模可扩展,
但是空间要求量大,必须使用压缩技巧,这样编程复杂度会增大,推荐研究算法用,比赛不用
总结:
类似本题的问题很多,光stamps问题多年来就一直存在各种变种,sticks问题与本体类似,通用的算法都是搜索,练熟搜索模板是基础,简化问题、掌
握剪枝技巧是解题关键。某些特殊问题可以用动态规划,但是并不是所有的都可以,例如sticks我试过是不能用动态规划的,而且比赛时候,思考会浪费时
间,所以推荐比赛时用搜索。(不排除某些题目用搜索通过不了的大数据,必须用动态规划解决,所以要估计好时间空间,选用稳妥的算法)
分享到:
相关推荐
本题“1010 STAMPS”就是这样一个运用动态规划思想解决的实际问题。从描述中我们可以了解到,这个问题提供了三种不同的C++代码实现,下面我们将详细探讨这个问题及其解决方案。 首先,我们要明确问题背景。假设我们...
2. "POJ1010-STAMPS.doc":这是一个文档文件,很可能包含了对问题的详细解释、解题思路、算法流程图、时间复杂度分析等内容,对于学习和理解这个问题的解法非常有帮助。 综合以上信息,我们可以推断,"POJ1010-...
标题“POJ1010-STAMPS 测试数据”涉及的是一个编程竞赛问题,源自北京大学ACM(美国计算机学会)在线判题系统POJ(Problem Online Judge)。问题STAMPS是1998年太平洋西北地区的比赛题目,旨在考验参赛者解决实际...
《POJ 1010 Stamps:解题思路与陷阱分析》 POJ 1010,也被称为“邮票问题”,是编程竞赛中的一道经典题目,旨在考察参赛者的动态规划和数学思维能力。这个题目在编程爱好者中具有较高的知名度,因为它涉及到有趣的...
**StaMPS_v3.2.1:高级地表形变监测的工具** StaMPS(Statistical Method for Persistent Scatterer Interferometry)是一款强大的软件工具,用于执行永久散射体干涉雷达(Persistent Scatterer Interferometry, ...
StaMPS软件操作流程 StaMPS是一款常用的InSAR处理软件,它可以对SAR影像进行处理和分析。下面是 StaMPS软件操作流程的详细介绍: Step 1: SAR影像原始数据准备 在这一步中,需要将SAR原始数据拷贝到SLC文件夹中,...
StaMPS/MTI是一种开源的永久散射体(Persistent Scatterers, PS)和小基线集合(Small Baseline Subset, SBAS)的综合处理方法,主要用于地面形变的测量。它由Andy Hooper、David Bekaert、Ekbal Hussain和Karsten ...
《StaMPS/MTI手册3.3b1版》是针对地表形变监测领域的一款强大工具,主要用于PS(永久散射体)时序分析和SBAS(子空间分解)时序分析。该手册由Andy Hooper、David Bekaert和Karsten Spaans等人编写,旨在为用户提供...
StaMPS软件操作流程 StaMPS软件操作流程是一种基于ROI_PAC的InSAR处理软件,用于处理Synthetic Aperture Radar(SAR)影像。下面是StaMPS软件操作流程的详细知识点: Step 1:SAR影像原始数据准备 * 建立SLC...
**StaMPS (Statistical Modeling of Asteroseismic Parameters)** 是一个开源软件工具,主要用于分析恒星振荡数据,特别是那些由NASA的Kepler、K2任务或即将到来的TESS任务收集的数据。StaMPS的目标是帮助天文学家...
在这篇文章中,我们将介绍如何使用SNAP和StaMPS软件结合PS-InSAR方法获取地表时间序列形变。 一、PS-InSAR技术概述 PS-InSAR技术是InSAR技术的一种,它可以对地表目标进行长期观测,获取其时间序列形变信息。该...
合成孔径雷达干涉测量PS-InSAR软件STAMPS的操作手册深入解析了如何利用STAMPS软件进行SAR影像处理,特别聚焦于成像处理阶段的详细步骤与关键指令的应用。以下是对标题、描述和部分文件内容中所提及的知识点的详细...
根据给出的文件内容,StaMPS(Small Temporal Baseline Subset Permanent Scatterers)是一款处理合成孔径雷达干涉测量(InSAR)数据的软件。以下是StaMPS教程中所涉及的相关知识点的详细介绍。 1. 发展历程 StaMPS...
**StaMPS(Statistical Moment-based Method for Persistent Scatterer Interferometry)是地球观测领域广泛应用的一款开源软件,主要用于处理 Synthetic Aperture Radar (SAR) 数据,进行持久散射体干涉测量...
**StaMPS (Statistical Modeling of Asteroseismic Parameters) 是一个开源软件工具,主要用于分析太阳和其他恒星的振荡数据,以进行 asteroseismology(恒星声学振荡)研究。该软件由 Matthew J. Hooper 开发,旨在...
**StaMPS_v2.2:PS-InSAR技术的基石** StaMPS(Small Baseline Subset)是一款在地球观测领域广泛应用的软件工具,主要用于处理合成孔径雷达(Synthetic Aperture Radar, SAR)数据,实现永久散射体(Persistent ...
snap2stamps 使用SNAP作为StaMPS的InSAR处理器 本手册和随附的脚本调用ESA SentiNel应用程序平台(SNAP)的例程,以在开源StaMPS软件包中进行摄取的情况下执行TOPSAR干涉测量处理。 SNAP to StaMPS手册随附的...
StaMPS(Small Baseline Subset)是InSAR时序分析的一种常用工具,由美国地质调查局(USGS)开发。它专门设计用于处理大量干涉对,以实现长时间序列的形变监测。StaMPS通过对短基线子集进行处理,降低了大气噪声的影响...
zoj 1812 Stamps.md