连续邮资问题

非常经典的题目 经典到我忍不住把题面也要放上来

邮局发行一套票面有n(0<n<=10)种不同面值的邮票。若限每封信所贴的邮票张数不得超过m枚存在整数r使得用不超过m(0<m<=2n)枚的邮票可以贴出连续整数1,2,3,…,r值来,找出这种面值数,使得r值最大。

算是搜索+dp的集合 想清楚了表达起来非常爽

回溯的方式简直暴力又神奇 然而最可怕的是数组还不能开到外面(被坑了一上午

自己一开始想到了dp的推展 然而忘记了自己在做搜索专题

下面这个这是错的qaq 不过dp的那一部分是正确的

 1 for (int i=2;i<=n;++i){
 2         for(int j=a[i-1][1]+1;j>a[i-1][0];--j){
 3             memset(c,0x7f,sizeof(c));
 4             for (int k=0;k<=a[i-1][1];++k) c[k]=b[k];
 5             int anss=-1;
 6             for (int k=0;k<a[i-1][1];++k)
 7                 for (int l=1;l<=m-b[k];++l) c[k+l*j]=min(c[k+l*j],c[k]+l);
 8             for (int k=a[i-1][1]+1;k<=j*m+1;++k) if (c[k]==2139062143) {anss=k-1;break;}
 9             if (anss>a[i][1]) a[i][1]=anss,a[i][0]=j;
10         }
11           ans=max(ans,a[i][1]);
12         for (int k=0;k<=a[i-1][1];++k)
13             for (int l=1;l<=m-b[k];++l) b[k+l*a[i][0]]=min(b[k+l*a[i][0]],b[k]+l);
14     }

下面是打得很丑的正解qwq

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<string>
 7 #define INF 1000000
 8 using namespace std;
 9 int a[40][2];
10 int n,m,ans;
11 int b[2000];
12 void dfs(int x){
13     if (x==n+1){
14         ans=max(ans,a[x-1][1]);
15         return ;
16     }
17     int c[2000];//一定不要定义出去了qaq
18     memcpy(c,b,sizeof(b));
19        for (int i=a[x-1][0]+1;i<=a[x-1][1]+1;++i){
20         a[x][0]=i;
21         for (int j=0;j<=a[x-1][0]*m;++j){
22             if (b[j]>=m) continue;
23             for (int k=1;k<=m-b[j];++k){
24                 b[j+k*i]=min(b[j+k*i],b[j]+k);
25             }
26             }
27         int r=a[x-1][1]+1;
28         while (b[r]!=INF) r++;
29         a[x][1]=r-1;
30         dfs(x+1);
31         memcpy(b,c,sizeof(c));
32     }
33 }
34 int main(){
35     freopen ("3.in","r",stdin);
36     freopen ("3.out","w",stdout);
37     scanf("%d%d",&n,&m);
38     a[1][0]=1,a[1][1]=m;
39     for (int i=1;i<=2000;++i) b[i]=INF;
40     for (int i=0;i<=m;++i) b[i]=i;
41     dfs(2);
42     cout<<ans;
43     return 0;
44   }
时间: 2024-11-02 11:39:56

连续邮资问题的相关文章

回溯法 -数据结构与算法

1.回溯法算法思想: 定义: 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”. 1.回溯法适用:有许多问题,当需要找出它的解集(全部解)或者要求回答什么解是满足某些约束条件的最优解时,往往要使用回溯法. 2.有组织的穷举式搜索:回溯法的基本做法是搜索或者有的组织穷尽搜索.它能避免搜索所有的可能性.即避免不必要的搜索.这种方

UVa 242 邮票和信封(完全背包)

https://vjudge.net/problem/UVA-242 题意: 输入s(每个信封能粘贴的最多邮票数量)和若干邮票组合,选出最大连续邮资最大的一个组合(最大连续邮资也就是用s张以内的邮票来凑1,2,3,4...n,如果无法凑成n+1,那么最大值也就是n了).如果有多个最大值,则优先考虑邮票数少的,其次考虑邮票面值最大的那个更小的. 思路: 完全背包问题. 完全背包是物品无限,在这里和题意相符合,每种邮票也是可以无限使用的.最大连续邮资就相当于一个背包容量,d[i]表示当最大连续邮资为

UVa 242 Stamps and Envelope Size (无限背包,DP)

题意:信封上最多贴S张邮票.有N个邮票集合,每个集合有不同的面值.问哪个集合的最大连续邮资最 大,输出最大连续邮资和集合元素. 最大连续邮资是用S张以内邮票面值凑1,2,3...到n+1凑不出来了,最大连续邮资就是n.如果不止一个集合结果相 同,输出集合元素少的, 如果仍相同,输出最大面值小的. 析:这个题,紫书上写的不全,而且错了好几次,结果WA好几次. 首先这个和背包问题差不多,我们只用一维就好.dp[i]表示邮资为 i 时的最小邮票数,然后,如果dp[i] > s就该结束了. 其他的就很简

UVa 242 - Stamps and Envelope Size(DP)

给出一个s,然后给出n组邮票,问那一组可以凑出最大连续邮资. 对每一组邮票,求出当邮资为i时需要邮票数的最小值d[i],边界为d[0]=0.d[i]>s时break.类似于背包问题的求法,具体方法见代码. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1010; int d[maxn],ans[20],num[20],a[20][

算法-蓝桥杯习题(四)

蓝桥杯习题 蓝桥杯练习系统习题加答案,总共分为6部分,90%习题使用C语言解答,部分使用C++或者Java.大部分习题为搜索参考或者别人提供所得,不足之处在所难免,恳请批评指正(预计200多题,习题仅供学习交流) 目录 算法训练(详见 算法-蓝桥杯习题(一))Go 算法训练(详见 算法-蓝桥杯习题(二))Go 算法提高(waiting...) 历届试题(详见 算法-蓝桥杯习题(六))Go 历届试题(详见 算法-蓝桥杯习题(七))Go 蓝桥杯练习系统评测数据 链接: http://pan.baid

uva242,Stamps and Envelope Size

这题紫薯上翻译错了 应该是:如果有多个并列,输出邮票种类最少的那个,如果还有并列,输出最大面值最小的那个 坑了我一个下午 dp[p][q]==1表示可以用不超过q张组成面额p 结合记忆化,p从1开始枚举,一直枚举找到dp[p][q]=0的时候就可以了 这题应该归类成一种背包吧 注意dp初始化的时候应该初始化为-1(我就因为粗心,tle好久) 最后输出的时候比较恶心 最终的修改后的代码 实验证明,先读入所有数据后再处理比边读数据边处理要快 /* * Author: Bingo * Created

从零开始学回溯算法

本文在写作过程中参考了大量资料,不能一一列举,还请见谅. 回溯算法的定义:回溯算法也叫试探法,它是一种系统地搜索问题的解的方法.回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试. 解题的一般步骤是: 1.定义一个解空间,它包含问题的解: 2.利用适于搜索的方法组织解空间: 3.利用深度优先法搜索解空间: 4.利用限界函数避免移动到不可能产生解的子空间. 问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性. 话不多说,我们来看几个具体的例子慢

UVA Stamps

题目如下: Stamps  The government of Nova Mareterrania requires that various legaldocuments have stamps attached to them so that the government canderive revenue from them. In terms of recent legislation, each classof document is limited in the number of

回溯算法入门及经典案例剖析(初学者必备宝典)

前言 基于有需必写的原则,并且当前这个目录下的文章数量为0(都是因为我懒QAQ),作为开局第一篇文章,为初学者的入门文章,自然要把该说明的东西说明清楚,于是...我整理了如下这篇文章,作者水平有限,有不足之处还望大家多多指出~~~ 概念 首先,回溯是什么意思?很多初学者都会问这样的一个问题.我们可以举这样一个例子: 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 我们看到了如图所示的一个4*4的迷宫了,我们假设数字1标记的位置为道路,数字0标记的位置为一堵墙,一个人由起点(0.0