美文网首页
回溯连续邮资问题

回溯连续邮资问题

作者: Super_邓帅 | 来源:发表于2017-01-02 12:39 被阅读0次


假设某国家发行了n种不同面值的邮票,并且规定每张信封上最多只允许贴m张邮票。连续邮资问题要求对于给定的n和m,给出邮票面值的最佳设计,在1张信封上贴出从邮资1开始,增量为1的最大连续邮资区间。 例如当n=5,m=4时,面值为1,3,11,15,32的5种邮票可以贴出邮资的最大连续区间是1到70。

分析:

有一个难点:最大可以贴n张邮票,也就是说1、2...n张都可以,究竟帖多少张是不固定的,但我们可以构造面值是0的邮票,差几张就加几张面值为0的票,目的是让贴的邮票数量成为一个定值,便于解答
  既然是回溯解决,自然想t代表什么。一般来说,t要么代表邮票数量,要么代表增长的区间的值,但是区间最大值究竟是多少是不知道的,无法写终止条件。
  贴邮票的数量已经通过面值0的邮票这一手段使它变成了一个定值,t就只能代表邮票数量了。

代码:

#include<stdio.h>
#define n 6      //邮票的面值种类加1,因为还要添加面值为0的邮票 
#define m 4      //最多贴m张邮票
int money=0,tmoney=0;   //money是连续区间的上限;  tmoney是过程值
int a[n]={0,1,3,11,15,32}; 
bool flag;

void traceback(int t){
    if(t==m){
        if(tmoney==money+1)
            flag=true;
        return;
    }   
    for(int i=0;i<n;i++){
        tmoney+=a[i];
        if(tmoney<=money+1)
            traceback(t+1);
        tmoney-=a[i];
    }   
}

int main(){
    while(true){ //最大值为多少,不知道,需不断循环确定
        flag=false;
        traceback(0);     //t代表邮票的数量 
        if(flag)
            money++;
        else
            break;
    }   
    printf("%d",money); 
    return 0;
} 
运行截图

相关文章

  • 回溯连续邮资问题

    假设某国家发行了n种不同面值的邮票,并且规定每张信封上最多只允许贴m张邮票。连续邮资问题要求对于给定的n和m,给出...

  • N皇后

    回溯法核心代码: n皇后问题回溯法

  • 八皇后问题

    问题的类别是回溯(backtrace). 回溯通常用递归实现。回溯中注意边界问题,避免越界。同时,剪枝可以减少ca...

  • 湛江启用邮资机宣传戳

    邮资机是一种直接在邮件上加盖日戳和邮资戳记,并具有记账和结算功能的自动化邮政设备。使用邮资机可以简化邮政业...

  • 回溯迷宫问题

    给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然...

  • 分治,回溯,BFS & DFS,Greedy,二分查找

    分治,回溯 ◉ 多数元素 ◉ 括号生成问题 (使用回溯) ◉ 岛屿数量 ◉ pow ◉ sub...

  • 简单模式匹配改进:KMP算法

    回溯问题 上一讲 BruteForce算法的结尾中,我们提到了BruteForce算法的缺点,其中一条就是回溯问题...

  • hard回溯-N皇后+数独 2020-09-16(未允禁转)

    所谓leetcode hard级别的回溯问题 回溯问题其实就是一个模板题,都是通过【带状态恢复的dfs】实现我们知...

  • 算法的设计思想2

    4,回溯法 回溯法是一种优化的穷举法。所谓穷举法就是穷举问题的所有可能性,直到发现解决问题的最佳解为止。回溯法会有...

  • 回溯vs记忆化递归 2020-11-01(未允禁转)

    本文再谈一谈回溯和记忆化递归的差别 1.回溯vs记忆化递归 1.从思考问题的角度看,使用回溯法解决问题,不涉及【不...

网友评论

      本文标题:回溯连续邮资问题

      本文链接:https://www.haomeiwen.com/subject/cxewvttx.html