Stamps and Enovelope Size

题意:

给你最多贴S张邮票。有N个邮票集合,每个集合有不同的面值。问哪个集合的最大连续邮资最大,输出最大连续邮资和集合元素。

如果不止一个集合结果相同,输出集合元素少的,如果仍相同,输出最大面值小的。

思路:

最开始直接进行的深搜,感觉应该会TL,就放弃了。主要是莫有想到记忆化搜索的使用 - -, 果然太年轻。

用dp[i][j]表示使用了j个邮票后还差i,。
记忆化搜索找出最大的可能,如果有相同的则进行比较

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int maxn = 1005;
int tp[15][15];
int a[15];
int n,num;
int dp[maxn][12]; int fin(int c,int cur,int sum)
{
if(sum > num)
return dp[cur][sum] = 0;
if(dp[cur][sum] != -1)
return dp[cur][sum]; if(sum == num && cur != 0)
return dp[cur][sum] = 0;
if(cur == 0)
return dp[cur][sum] = 1;
for(int i = 1; i <= tp[c][0]; i++)
{
if(cur < tp[c][i])
continue;
dp[cur][sum] = fin(c,cur-tp[c][i],sum+1);
if(dp[cur][sum] == 1)
return 1;
}
return dp[cur][sum];
} int get_(int a,int b)
{
if(tp[a][0]<tp[b][0])return a; //比长度
if(tp[b][0]<tp[a][0])return b;
for(int i=tp[a][0]; i>0; i--)
{
if(tp[a][i]<tp[b][i])return a; //比最大值
if(tp[b][i]<tp[a][i])return b;
}
return a;
} int main()
{
while(scanf("%d",&num)!= EOF && num)
{
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
scanf("%d",&tp[i][0]);
for(int j = 1; j <= tp[i][0]; j++)
{
scanf("%d",&tp[i][j]);
}
} int tans = -1;
int ans = -1;
for(int i = 1; i <= n; i++)
{
int tt = 0;
int t = 0;
memset(dp,-1,sizeof(dp));
for(int j = 1;; j++)
{
if(fin(i,j,0))
{
tt = j;
t = i;
}
else
break;
}
if(ans < tt)
{
ans = tt;
tans = t;
}
else if(ans == tt)
{
tans = get_(t,tans);
}
}
printf("max coverage =%4d :",ans);
for(int i = 1; i <= tp[tans][0]; i++)
{
printf("%3d",tp[tans][i]);
}
printf("\n");
}
}

  

习题9-5 UVA 242的更多相关文章

  1. uva 242

    242 - Stamps and Envelope Size Time limit: 3.000 seconds  Stamps and Envelope Size  Philatelists hav ...

  2. Uva 242 邮票和信封

    题目链接:https://vjudge.net/contest/146179#problem/D 题意: 信封上最多贴S张邮票.有N个邮票集合,每个集合有不同的面值.问哪个集合的最大连续邮资最大,输出 ...

  3. UVA - 242 线性DP

    题意:给定多种邮票的组合,邮票最多只能用S张,这些邮票能组成许多不同面额,问最大连续面额的长度是多少,如果有多个组合输出组合中邮票数量最少的,如果仍有长度一致的,输出邮票从大到小排序后字典序最大的那个 ...

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

    https://vjudge.net/problem/UVA-242 题意: 输入s(每个信封能粘贴的最多邮票数量)和若干邮票组合,选出最大连续邮资最大的一个组合(最大连续邮资也就是用s张以内的邮票来 ...

  5. UVA - 242 Stamps and Envelope Size (完全背包+bitset)

    题意:给你一些邮票面值的集合,让你选择其中一个集合,使得“能用不超过n枚集合中的邮票凑成的面值集合S中从1开始的最大连续面值”(即mex(S)-1)最大.如果有多解,输出集合大小最小的一个:如果仍有多 ...

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

    题意:信封上最多贴S张邮票.有N个邮票集合,每个集合有不同的面值.问哪个集合的最大连续邮资最 大,输出最大连续邮资和集合元素. 最大连续邮资是用S张以内邮票面值凑1,2,3...到n+1凑不出来了,最 ...

  7. Stamps ans Envelope Sive UVA - 242

    ( ||{集合x}表示x中元素1||x中元素2||...||x的最后一个元素||(a,b)表示a||b) ans[i][j][k]表示考虑前i种邮票时取j个邮票能否得到面值kans[i][j][k]= ...

  8. 【Uva 242】Stamps and Envelope Size

    [Link]: [Description] 给你n个集合; 每个集合都包含一些不同面额的邮票; (每种邮票都当做有无限张) 然后给你一封信上最多能贴的邮票张数S; 问你,哪一个集合的邮票; 能够贴出来 ...

  9. ACM训练计划建议(写给本校acmer,欢迎围观和指正)

    ACM训练计划建议 From:freecode#  Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...

随机推荐

  1. Android接受验证码自动填入功能(源码+已实现+可用+版本兼容)

    实际应用开发中,会经常用到短信验证的功能,这个时候如果再让用户就查看短信.然后再回到界面进行短信的填写,难免有多少有些不方便,作为开发者.本着用户至上的原则我们也应该来实现验证码的自动填写功能,还有一 ...

  2. C#系统服务安装

    转载 http://blog.csdn.net/vvhesj/article/details/8349615 1.1创建WindowsService项目 导入需要的引用比如System.configu ...

  3. 记一次SQL调优/优化(SQL tuning)——性能大幅提升千倍以上

    好久不写东西了,一直忙于各种杂事儿,恰巧昨天有个用户研发问到我一个SQL调优的问题,说性能太差,希望我能给调优下,最近有些懒,可能和最近太忙有关系,本来打算问问现在的情况,如果差不多就不调了,那哥们儿 ...

  4. Mysql必须知道的知识

    最近在准备面试,所以也整理了一些Mysql数据库常用的知识,供大家参考. 1.MySQL的复制原理以及流程 (1).复制基本原理流程 1. 主:binlog线程--记录下所有改变了数据库数据的语句,放 ...

  5. js实现图片(高度不确定)懒加载

    最近一直在弄广告页,由于广告页几乎都是图片拼凑起来的,为了减少服务器压力和带宽,采用图片懒加载方式,但是我们的图片高度又不确定,所以我在网上下载了echo.js自己改了一下. 大体思路是:让首页先加载 ...

  6. SpringBoot单元测试中的事务和Session

    1.Springboot中使用junit编写单元测试,并且测试结果不影响数据库. 2.

  7. Linux知识积累(4) Linux下chkconfig命令详解

    Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. ...

  8. 新概念英语(1-a)句子集锦

  9. ibatis的优缺点及可行性分析

    1.优点 简单: 易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现. 实用: 提供了数据映射功能,提供了对底层数据访问的封装(例如ado.net),提供了DAO框架,可以使我 ...

  10. Django实现 省 市 县 自关联的下拉级联

    前端部分: 三个下拉拉菜单进行级联 <body> <select id="province" > <option value="" ...