邮票面值设计【NIOP1995】

本文探讨了一道动态规划问题,即在有限种类邮票的情况下,设计邮票面值以覆盖1到最大值之间的所有邮资。通过举例说明了如何找到能覆盖连续邮资的最大值,并给出了输入输出格式。示例中展示了N=3,K=2时的解,即1分和3分邮票,最大连续邮资为7分。

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

问题描述
  给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤13)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值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分。
输入格式
  一行,两个数N、K
输出格式
  两行,第一行升序输出设计的邮票面值,第二行输出“MAX=xx”(不含引号),其中xx为所求的能得到的连续邮资最大值。
样例输入
3 2
样例输出
1 3
MAX=7
 

这是在刷公司OnlineJudge时刷到的题目,不会做这种动态规划的题目。看了别人cpp的题解,用python实现了一下。后续再补充注释。

list1=input().split()
N=int(list1[0])
K=int(list1[1])
count=[0 for i in range(20)]
sum=[0 for i in range(20)]
value=[0 for i in range(1001)]
def dp(n):
    x=get(n)
    if n==K:
        return;
    for i in range(x,count[n]-1,-1):
        count[n+1]=i
        dp(n+1)


def get(n):
    for i in range(1,1001):
        value[i]=1000
        for j in range(1,n+1):
            if i>=count[j]:
                value[i]=min(value[i],value[i-count[j]]+1)

        if value[i]>N:
       
### NOIP2008 提高组 概述 NOIP2008(全国青少年信息学奥林匹克联赛)提高组的比赛吸引了众多选手参与。该赛事旨在考察参赛者在算法设计、编程实现等方面的能力。 ### 题目概述 比赛共设有四道题目,涵盖了不同的知识点和技术要点: 1. **传纸条** 这是一道经典的动态规划问题,要求计算从矩阵一角到另一角传递消息的最大价值路径[^3]。 2. **双栈排序** 此题涉及数据结构的应用,特别是栈的操作及其组合使用来完成特定序列的排序任务[^4]。 3. **笨小猴** 主要测试字符串处理能力以及简单的贪心策略应用,在给定条件下寻找最优解方案[^5]。 4. **火柴棒等式** 属于数论范畴,通过调整算术表达式的构成部分使得最终结果满足一定条件下的最大可能性[^6]。 ### 解题思路分析 针对上述各题目的解决方案通常会经历如下思考过程: 对于《传纸条》这类最优化求解类问题,可以采用二维数组记录状态转移方程的方式来进行高效解答;而对于像《双栈排序》这样的结构性难题,则需充分理解并灵活运用所掌握的数据结构特性,比如利用两个栈模拟队列操作从而达到预期效果;至于《笨小猴》,则更多依赖于对输入模式的理解与快速匹配技巧;最后,《火柴棒等式》考验的是考生们如何巧妙转换视角看待传统数学运算规则,并据此构建合理的枚举框架以穷尽所有可行选项。 ```cpp // 示例代码片段展示一种可能用于解决“传纸条”的方法 #include <iostream> using namespace std; const int MAXN = 50 + 5; int dp[MAXN][MAXN], a[MAXN][MAXN]; int main() { // 初始化及读入省略... for (int i = n; i >= 1; --i) { for (int j = m; j >= 1; --j) { dp[i][j] = max(dp[i+1][j],dp[i][j+1]) + a[i][j]; } } cout << "The maximum value is:" << endl; cout << dp[1][1]<<endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值