习题9-5 UVA 242
题意:
给你最多贴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的更多相关文章
- uva 242
242 - Stamps and Envelope Size Time limit: 3.000 seconds Stamps and Envelope Size Philatelists hav ...
- Uva 242 邮票和信封
题目链接:https://vjudge.net/contest/146179#problem/D 题意: 信封上最多贴S张邮票.有N个邮票集合,每个集合有不同的面值.问哪个集合的最大连续邮资最大,输出 ...
- UVA - 242 线性DP
题意:给定多种邮票的组合,邮票最多只能用S张,这些邮票能组成许多不同面额,问最大连续面额的长度是多少,如果有多个组合输出组合中邮票数量最少的,如果仍有长度一致的,输出邮票从大到小排序后字典序最大的那个 ...
- UVa 242 邮票和信封(完全背包)
https://vjudge.net/problem/UVA-242 题意: 输入s(每个信封能粘贴的最多邮票数量)和若干邮票组合,选出最大连续邮资最大的一个组合(最大连续邮资也就是用s张以内的邮票来 ...
- UVA - 242 Stamps and Envelope Size (完全背包+bitset)
题意:给你一些邮票面值的集合,让你选择其中一个集合,使得“能用不超过n枚集合中的邮票凑成的面值集合S中从1开始的最大连续面值”(即mex(S)-1)最大.如果有多解,输出集合大小最小的一个:如果仍有多 ...
- UVa 242 Stamps and Envelope Size (无限背包,DP)
题意:信封上最多贴S张邮票.有N个邮票集合,每个集合有不同的面值.问哪个集合的最大连续邮资最 大,输出最大连续邮资和集合元素. 最大连续邮资是用S张以内邮票面值凑1,2,3...到n+1凑不出来了,最 ...
- 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]= ...
- 【Uva 242】Stamps and Envelope Size
[Link]: [Description] 给你n个集合; 每个集合都包含一些不同面额的邮票; (每种邮票都当做有无限张) 然后给你一封信上最多能贴的邮票张数S; 问你,哪一个集合的邮票; 能够贴出来 ...
- ACM训练计划建议(写给本校acmer,欢迎围观和指正)
ACM训练计划建议 From:freecode# Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...
随机推荐
- Java ftp 上传文件和下载文件
今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下.结果悲剧了,运行不通过.(装逼失败) 我找的文章链接: ...
- 如何书写高效的css样式
如何书写高效的css样式? 有以下四个关键要素: 1.高效的css 2.可维护的css 3.组件化的css 4.hack-free css 书写高效的css: 1.使用外联样式替代行间样式或内嵌样式 ...
- Java8-如何构建一个Stream
Stream的创建方式有很多种,除了最常见的集合创建,还有其他几种方式. List转Stream List继承自Collection接口,而Collection提供了stream()方法. List& ...
- JAVA_SE基础——65.StringBuffer类 ②
字符串特点:字符串是常量:它们的值在创建之后不能更改. 字符串的内容一旦发生了变化,那么马上会创建一个新 的对象. 注意: 字符串的内容不适宜频繁修改,因为一旦修改马上就会创建一个新的对象 ...
- Java 持久化之 --io流与序列化操作
1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsolutePath() 文件名:getName() 文件相对路径:getPath() 文件的上一级目录:g ...
- JQ 标签相关知识
1.判断 checkbox 和 radio 是否选中 if($("标签选择器").is(":checked")) 2.改变 checkbox 选中状态 .pro ...
- 算法题丨Move Zeroes
描述 Given an array nums, write a function to move all 0's to the end of it while maintaining the rela ...
- Mac里安装Jmeter
前提是需要安装jdk,参见http://www.cnblogs.com/fun0623/p/4703456.html 1.解压包 (双击apache-jmeter-2.13) 2.进去到解压后的bin ...
- python中的进程池:multiprocessing.Pool()
python中的进程池: 我们可以写出自己希望进程帮助我们完成的任务,然后把任务批量交给进程池 进程池帮助我们创建进程完成任务,不需要我们管理.进程池:利用multiprocessing 下的Pool ...
- Extensions in UWP Community Toolkit - SurfaceDialTextbox
概述 UWP Community Toolkit Extensions 中有一个为TextBox 提供的 SurfaceDial 扩展 - SurfaceDialTextbox,本篇我们结合代码详细讲 ...