邮票问题---动态规划

动态规划解邮票面值问题:完全背包与连续邮资算法详解 动态规划是解决组合优化问题的核心算法思想,尤其在处理‘能否凑出特定金额’这类可达性判断时,常被建模为完全背包问题。其原理是通过状态转移方程,如 dp[j] = min(dp[j], dp[j - stamp] + 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。

输入:

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

输出:

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

样例输入:

5 2
1 3

样例输出:

13


分析:

1.数据分析:每个信封最多贴K(K<=200)张邮票,每张邮票的面值不超过10000,能贴出最大的邮资不超过2000000,可用一个数组来表示能够表示贴出每种邮资。


2.算法分析:

(1)搜索:每种邮票最多贴200张,总共50种,朴素的深搜规模将达到50^200。

(2)动态规划:

        <1>阶段:能够构成每个面值为阶段。比如能构成的面值为1到V,那么总共为V个阶段。

        <2>状态:dp[i]表示构成面值i所需要的最少邮票数.

        <3>决策:对于样例数据1和3两种面值的邮票:

                    构成邮资0:所需要邮票张数为0张,dp[0]=0;

                    构成邮资1:只能用1分的邮票,所需要邮票张数1张,dp[1]=1;

                    构成邮资2:只能用1分的邮票,所需要邮票张数2张,dp[2]=2;

                    构成邮资3:

                             *1.若选择使用一张1分的邮票,dp[3]=dp[2]+1=3………dp[3-1]+1

                             *2.若选择使用一张3分的邮票,dp[3]=dp[0]+1=1………dp[3-3]+1

                                       dp[3]=min{dp[2]+1,dp[0]+1}=1;

                     构成邮资4:

                             *1.若选择使用一张1分的邮票,dp[4]=dp[3]+1=2………dp[4-1]+1

                             *2.若选择使用一张3分的邮票,dp[4]=dp[1]+1=2………dp[4-3]+1

                                       dp[4]=min{dp[3]+1,dp[1]+1}=2;

        <4>状态转移方程:dp[i]=min{dp[i-a[j]]+1}    i>=a[j]  1<=j<=n    f[i]<=k;

#include <iostream>  
#include <algorithm>  
  
using namespace std;  
  
int Answer;  
int dp[2000001];  
  
int main(int argc, char** argv)  
{  
    int T, test_case;  
    
   
    cin >> T;  
    for (test_case = 0; test_case < T; test_case++)  
    {  
  
        Answer = 0;  
        int K = 0;  
        int N = 0;  
  
        cin >> K >> N;  
        int *a = new int[N+1];  
        for (int i = 0; i < N; i++)  
        {  
            cin >> a[i];  
        }  
  
        sort(a, (a + N));  
        dp[0] = 0;  
  
        while (dp[Answer] <= K)  
        {  
            Answer++;  
            dp[Answer] = 999999;  
            for (int j = 0; j < N && a[j] <= Answer; j++)  
            {  
                if (dp[Answer - a[j]] + 1 < dp[Answer])  
                    dp[Answer] = dp[Answer - a[j]] + 1;  
            }  
        }  
        cout << "Case #" << test_case + 1 << endl;  
        cout << Answer << endl;  
        delete[]a;  
    }  
  
    return 0;
}  

原作者写的内容有错误,解释的地方发生错误很难看得懂,所以纠正了一下。文章最下面是作者的原文链接;

转自 【算法】【动态规划】 邮票问题
掌握动态规划:背包问题与邮票问题的解决方案 本文探讨了动态规划算法在解决背包问题和邮票问题中的应用。通过一系列具体问题,如最少能量获得指定分数、邮票等值最小化问题和最大化问题,以及罐头食品数量最大化问题,我们展示了如何构建递推关系和归纳编程算法,以及如何使用这些算法来高效地找到问题的最优解。 阅读详情

相关推荐

MCGS触摸屏Modbus TCP通讯实战:从寄存器写入到字符串处理的完整代码解析

本文详细解析了MCGS触摸屏通过Modbus TCP协议实现寄存器写入和字符串处理的完整代码,涵盖单寄存器写入、多寄存器写入及字符串传输等核心技术。文章还提供了MCGS组态环境中的实战配置步骤和常见问题排查方法,帮助开发者快速掌握工业自动化通讯的关键技术。

study的专栏 758

P4550 收集邮票-洛谷luogu

传送门 题目描述 有n种不同的邮票,皮皮想收集所有种类的邮票。唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n。但是由于凡凡也很喜欢邮票,所以皮皮购买第k张邮票需要支付k元钱。现在皮皮手中没有邮票,皮皮想知道自己得到所有种类的邮票需要花费的钱数目的期望。 输入输出格式 输入格式: 一行,一个数字NN&...

weixin_30510153的博客 210

【配环境】ubuntu18.04 3080ti显卡+cuda+cudnn+torch

1.打开系统设置中的software & updates点击 System Settings,选择 Additional Drivers 标签,下面会列出当前显卡可用的驱动版本。 注意:3080ti建议不要安装最新版本驱动 点击Apply Changes即可安装; 注意:3080ti只能装cuda11.x 修改软连接修改系统使用的cuda 卸载老版本cuda 重新查询看是否卸载成功 显卡驱动及CUDA Toolkit最高对应版本 查询驱动版本............

sinat_41670685的博客 3913

邮票(DP或贪心)

/* http://www.acmore.net/problem.php?id=1084  邮票 已知一个 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K —— 表示信封上能够贴 K 张邮票。计算从 1 到 M 的最大连续可贴出的邮资。 例如,假设有 1 分和 3 分的邮票;你最多可以贴 5 张邮票。很容易贴出 1 到 5 分的邮资(用 1 分邮票贴就行了),接下来的邮资也不难

JHC23的专栏 1100

BAPI_OUTB_DELIVERY_CHANGE扩展指南:利用EXTENSION2与SMOD_V50B0001实现自定义字段更新

本文详细解析了如何利用BAPI_OUTB_DELIVERY_CHANGE的EXTENSION2参数与增强点SMOD_V50B0001,在不修改标准代码的前提下,安全、标准地更新SAP交货单的自定义字段。通过清晰的步骤指南和实战代码示例,帮助开发者掌握通过增强字段实现定制化业务需求的完整流程与调试技巧。

fanta的博客 451

解决 python2.7中 ImportError: No module named Crypto.Signature

我的解决办法,先查看有没有安装 pip,直接执行pip 回车 没有出现null什么的就安装了,如果没有安装去其他博客哪里看一下,正常情况是默认就有的,然后使用。发现我自己也不会啊,就百度看看,想着网上的解决方法一大片,但是都是废话,能用的没有几个,而且能安装的没有几个。这个里面的python2、3就是系统里面的python版本,直接跟我这样就可以了除非版本不一样,也就是没有这个版本。就可以使用了,第一个应该是卸载之前的,然后重新安装,我的就是这样解决的。就比如我的,我现在使用的 python2.7。

记录一下 1610

邮票问题

(一)   邮票问题(Problem Set 1746):1.    问题描述设有n种不同面值a1, a2,…, an的邮票,规定每封信最多贴m张邮票。对于给定的m,n,求出最大的邮资连续区间。例如,给定n=3,m=3,邮票面值分别为2, 3, 5,则最大的邮资连续区间为[2,13]。2.       具体要求Input输入的第一行是一个正整数n,表示测试例个数。接下来几行是n

wjw2586121的专栏 2421

[Ethernet in CANoe]3--CANoe工程中SOME/IP报文的详细介绍(一)

和上述第一章节的介绍,我们对SOEMIP通信协议有了初步了解,首先我们先暂停Trace窗口,可以看到整个Trace窗口关于SOMEIP的报文有两种颜色,一种是紫色,另一种是绿色。它使用多播地址,允许服务提供者发布其服务,服务消费者订阅这些服务。上述每点开一个SOMEIP报文,左侧的details就能看到该报文中的具体细节,从IP地址到port口,再到具体的serviceID,都能详细的解析。一旦通过服务发现完成了服务的发布和订阅,服务消费者就可以向服务提供者发送请求,或者服务提供者向消费者发送事件通知。

汽车ECU自动化测试 1412

邮票问题(动态规划)

题目意思: 设有已知面额的邮票m种,每种有n张,用总数不超过n张的邮票,能从面额1开始,最多连续组成多少面额。(1≤m≤100,1≤n≤100,1≤邮票面额≤255) 输入 第一行:m,n的值,中间用一空格隔开。 第二行:A[1..m](面额),每个数中间用一空格隔开。 输出 连续面额数的最大值 样例输入Copy 3 4 1 2 4 样例输出Copy 14 代码: #include<stdio.h> #include<iostream> #...

Syclus的博客 2169

【WRF-CMAQ实战指南】从环境配置到测试案例运行全解析

本文详细解析了WRF-CMAQ从环境配置到测试案例运行的全过程,包括系统环境检查、依赖库安装、源码获取与项目初始化、关键配置技巧、编译实战与排错、测试案例运行验证等关键步骤。通过实战指南,帮助用户快速掌握WRF-CMAQ的安装和运行技巧,提升空气质量模拟的效率。

year5的博客 245

Aurora 8B/10B IP核介绍 —— Xilinx 技术文档Pg046

一、概述该IP核与用户接口之间支持AXI4-Stream协议,且基于ZYNQ SOC、A7、K7、V7以及UltraScale、UltraScale+系列FPGA的高速收发器(the high-speed serial transceivers)进行实现。多达 16 个连续绑定4 个连续绑定的 GTP 收发器framingstreaming以及全双工或单工加扰消扰CRC校验热插拔Aurora 8B/10B核心(图1-1)是一种可扩展的、轻量级的、用于高速串行通信的链路层协议;

qq_32147275的博客 1640

BZOJ_P1426 收集邮票(概率+动态规划)

BZOJ传送门 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 202 Solved: 159 [Submit][Status][Discuss] Description 有n种不同的邮票,皮皮想收集所有种类的邮票。唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n。但是由于

BeiYu 720

【Arduino 动手做】六舵机自平衡 Rotary Stewart 平台

《Arduino六舵机自平衡Rotary Stewart平台项目》 该项目展示了一个基于Arduino的六自由度Rotary Stewart平台,通过六个舵机实现动态平衡控制。设计采用激光切割框架和TAMIYA 70171套件,提供详细组装指南和开源固件(GitHub可获取)。开发者丹·罗耶分享了3D打印文件、视频演示及运动学优化需求,强调该平台可扩展应用于游戏控制(如Kerbal Space Program)或教育领域。项目链接包含完整资源包,鼓励用户参与改进并分享创作成果。该案例体现了Arduino在机

雕爷学编程 1092

邮票问题-动态规划

邮票问题 【问题描述】       给定一个信封,最多只允许粘贴N(N张邮票,我们现在有m(m种邮票,面值分别为:x1,x2,…….xm分(xi为正整数),并假设各种邮票都有足够多张.        要求计算所能获得的邮资最大范围,即求最大值MAX,使在1—MAX之间的每一个邮资值都能得到.        例如:N=4,有2种邮票,面值分别为1分,4分,于是可以得到1----10分,和12

ly59782的博客 3596

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

动态规划解决最小邮票数问题

题目描述: 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。 如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。 解题思路: 简单的自底向上动态规划解决问题,每次扫描一张邮票,在当前最优解的基础上得到加上这一枚邮票的最优解; 实现代码: #include<iostream> #include<vector> using namespace std; int main(){ int m,n; while

weixin_45103234的博客 446

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

由硬币问题和邮票问题看动态规划

由于实习时候被一个臭屁的老总(文科博士)

top_along的专栏 980

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【回溯法+动态规划】连续邮资问题——最佳邮票面值设计

想象你是邮票设计师,如何指定n种面值使得1张信封上贴m枚邮票能“连续”贴出最大区间?这就是《连续邮资问题》。它结合了回溯和DP思想,是算法训练的好素材!连续邮资问题是回溯+剪枝+动态规划结合体,适合进阶训练设计高效搜索算法,对算法竞赛与职位笔试很有帮助!

2301_79062072的博客 612

动态规划解邮票问题:从完全背包到最大连续邮资

动态规划是解决组合优化问题的核心算法思想,它通过将复杂问题分解为重叠子问题并存储中间结果,避免了重复计算,从而显著提升效率。其技术价值在于能够将指数级的时间复杂度优化为多项式级别,广泛应用于资源分配、路径规划、序列分析等场景。在算法面试与编程竞赛中,完全背包问题及其变体是考察动态规划掌握的经典题型。本文以邮票问题为例,深入探讨了如何将无限面值组合问题抽象为完全背包模型,并利用动态规划求解最大连续可组成邮资。通过分析状态定义、转移方程及上界确定等关键步骤,并结合代码实现与调试技巧,帮助读者巩固动态规划与背包问

328

【模板】动态规划之背包问题(01背包、多重背包、完全背包) (邮票、Piggy-bank题解)

DP求解核心:状态转移方程和边界条件。 最朴素的01背包问题 注意点: 1. 理解dp[][]的意义,表示前i种物品在重量为j时的最大价值。 2. 在选择放入物品时,注意对背包大小判断。 //二维数组 #include<iostream> #include<cstring> #include<algorithm> #define N 10...

coderwait 934

(4)邮票问题____动态规划

Stamps 邮票问题 题目描述:  已知一个 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K —— 表示信封上能够贴 K 张邮票。计算从 1 到 M 的最大连续可贴出的邮资。  例如,假设有 1 分和 3 分的邮票;你最多可以贴 5 张邮票。很容易贴出 1 到 5 分的邮资(用 1 分邮票贴就行了),接下来的邮资也不难:  6 = 3 + 3  7 = 3 + 3

YzlCoder的记事本 7119

【算法】【动态规划】 邮票问题

题目描述:  已知一个 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K —— 表示信封上能够贴 K 张邮票。计算从 1 到 M 的最大连续可贴出的邮资。  例如,假设有 1 分和 3 分的邮票;你最多可以贴 5 张邮票。很容易贴出 1 到 5 分的邮资(用 1 分邮票贴就行了),接下来的邮资也不难:  6 = 3 + 3  7 = 3 + 3 + 1  8 =

boywgw的专栏 3714

动态规划+深搜 解邮票面值设计问题

动态规划+深搜 解邮票面值设计问题 题目描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1至MAX之间的每一个邮资值都能得到。 例如,N=3,K=2,如果面值分别为1分、4分,则在1分~6分之间的每一个邮资值都能得到(当然还有8分、9分和12分);如果面值分别为1分、3分,则在1分~7分之间的每一个邮资值都能得到。可以验证当N=3,K=2时,7分就是可以得到的连续的邮资最大值,所以MAX=7,面值

qq_41117896的博客 758

最小邮票数

题目描述 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。 如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。 输入描述: 有多组数据,对于每组数据,首先是要求凑成的邮票总值M,M&lt;100。然后是一个数N,N〈20,表示有N张邮票。接下来是N个正整数,分别表示这N张邮票的面值,且以升序排列。 输出描述: 对于...

weixin_38522681的博客 196

C语言邮票组合问题:从DFS递归到动态规划优化全解析

组合优化问题在算法面试和工程实践中处处可见,如何高效枚举所有可行解是核心挑战。以递归和回溯为基础的深度优先搜索(DFS)虽然直觉清晰,却常因组合数爆炸而卡死;动态规划通过“最少张数”状态合并同类路径,将复杂度从组合级降至线性级。文章以邮票组合问题为例,详解从DFS暴力枚举到动态规划优化的完整链路,并针对递归去重、数组越界、整数溢出等C语言典型陷阱给出定位方法。这类问题广泛存在于邮资计算、砝码称重、硬币找零等场景,理解状态设计与剪枝技巧,能帮助开发者举一反三。本文完整复盘调试过程,适合准备笔试、刷算法题或想精

weixin_30983353的博客 224

东华复试100 邮票

100 邮票 作者: Turbo时间限制: 1S章节: 动态规划 问题描述 : 已知一个 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 +

fxwentian的博客 352
上一篇: android聊天软件开发,实战篇(2)
下一篇: VS Code开启第一个VUE前端项目(1)
Batman_Encoding
博客等级 码龄10年 13粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值