算法设计与分析:第五章 回溯法 5.9连续邮资问题

/*
连续邮资问题:
假设国家发行了n种不同面值的邮票,并且规定每张信封上最多只允许贴m张邮票。连续邮资问题要求对于给定的n和m的值,给出邮票面值的最佳设计,在
一张信封上可以贴出从邮资1开始,增量为1的最大连续邮资区间。

举例分析:
当n=2,m=3时,如果面值分别为1和4,则可以获得的邮资范围为1~6 加上 8 , 9 , 12
如果过面试为1,3,则可以获得1~7之间的每个邮资值,并且7就是可以得到的连续的邮资最大值


问题分析:
寻找子集就是子集树
寻找元素排列就是排列树
这是子集树问题,因为要求一个集合S,集合S中的元素满足某种性质。是从n个元素的集合S中,找出S满足某种性质的子集
思路:搜索可行解
解向量:用n元组x[1:n]表示n总不同邮票面值,从小到大排列
约束函数:若选定x[1:i-1],并且取值范围为:1~r,那么x[i]取值范围为x[i-1]+1~r+1

如何确定r的值?
计算x[1:1]的最大连续邮资区间时,直接递归复杂度较高。
尝试计算用不超过m张面值为x[1:i]贴出邮资k所需的最少邮票数为y[k],通过y[k]可以推算出r(最大连续邮资)的值,
y[k]可以通过递推在O(n)时间内解决


不懂
算法步骤:
1 初始化数组
2 计算任意邮资需要的最少张数
3 判断是否越界,并更新最优值
4 拷贝数组,对x[i]范围的x[i-1]+1 到 r,更新当前解,递归调用 , 回溯

输入:
2(邮票的种类数) 3(允许张贴的邮票数)


2 3


5 4

输出:
7
1 3

70
1 3 11 15 32
*/

#include <iostream>
#include <string.
  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值