codevs 1047 邮票面值设计 DFS+DP 解题报告

本文介绍了如何使用DFS和DP方法解决codevs上的邮票面值设计问题。通过深搜结合DP确定邮票面值的上界,以找到能够覆盖1到连续最大邮资值的所有组合。样例输入为3 2,输出为1 3,MAX=7,说明面值1分和3分的邮票可以形成最大的连续邮资7分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述 Description

给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值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,面值分别为1分、3分。

输入描述 Input Description

N和K

输出描述 Output Description

每种邮票的面值,连续最大能到的面值数。数据保证答案唯一。

样例输入 Sample Input

3 2

样例输出 Sample Output

1 3

MAX=7

思路

虽然深搜,但是邮票面值的上界在深搜中不好确定,只知道下界,怎么办呢?用DP解决深搜的上界,和当前邮票可以取到的连续最大值

DFS:

对每一步,枚举邮票面值,然后搜索下一张邮票面值并更新最优解。

DP

背包确定搜索范围。
假设现在枚举到第 i 张邮票面值,第 i-1 张邮票面值为a[i-1],前 i-1 张邮票得到的最大连续值为x,则第 i 张邮票面值的范围就为

[a[i-1]+1,x+1];

假设现在有 n 张邮票,怎么得到其最大连续值呢?
用 f[i] 记录达到数值 i 所需的最小邮票

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值