Luogu T24242 购物券Ⅰ(数据已加强)
这是一道比赛时的题目,但由于我没报名,所以浪费了一个大好的切水题的机会。
是经典的meet in middle(折半搜索)的模板题,但是之前一直没找到这种题目,今天终于看到了。
由于m的范围极大,因此一般的背包DP是行不通的。
如果直接进行2^n的爆搜,也只有40分。
所以这里我们观察数据n=40,发现如果是2^(n/2),就可以像前面一样跑过去。
所以我们缩小范围,先在1到n/2的范围内找出所有m以内的价值的和,用hash来存(这里需要挂链);
然后同样的在n/2+1到n的范围内找出所有m以内的价值的和,接着通过hash查询是否存在m-tot,如果有说明有解可以退出。
这应该是meet in middle的最简单的合并两部分的方式了吧。
需要注意的是hash的时候直接%一个数就可以了,不用乘来乘去浪费时间(我就是这样TLE了好几次),通过挂链来实现查询。
具体实现看代码CODE
#include<cstdio>
#include<cstring>
using namespace std;
const int N=,mod=;
struct egde
{
int v,next;
}link[(<<)+];
int head[mod],a[N],n,m,k;
bool h[mod],flag;
inline void read(int &x)
{
x=; char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
}
inline void add(int x,int y)
{
link[++k].v=y; link[k].next=head[x]; head[x]=k;
}
inline int hash(int k)
{
return k%mod;
}
inline void init(int k,int tot)
{
if (flag) return;
if (tot==m) { flag=; return; }
if (k>n/)
{
int t=hash(tot);
h[t]=; add(t,tot);
return;
}
if (tot+a[k]<=m) init(k+,tot+a[k]);
init(k+,tot);
}
inline void DFS(int k,int tot)
{
if (flag) return;
if (k>n)
{
int now=hash(m-tot);
if (!h[now]) return;
for (register int i=head[now];i!=-;i=link[i].next)
if (link[i].v==m-tot) { flag=; break; }
return;
}
if (tot+a[k]<=m) DFS(k+,tot+a[k]);
DFS(k+,tot);
}
int main(void)
{
register int i;
while (scanf("%d%d",&n,&m)!=EOF)
{
memset(h,,sizeof(h));
memset(link,-,sizeof(link));
memset(head,-,sizeof(head));
for (i=;i<=n;++i)
read(a[i]);
k=flag=;
init(,);
if (flag) { puts("YES"); continue; }
DFS(n/+,);
puts(flag?"YES":"NO");
}
return ;
}
Luogu T24242 购物券Ⅰ(数据已加强)的更多相关文章
- vue数据已渲染成 但还是报错 变量 undefined
问题:页面上的数据已渲染出来,但是控制台还是报错变量未undefined,主要是当页面加载完成后,数据并未加载完,所以会报次错误. 解决办法:在数据渲染的主节点(最外层的div)添加 v-if=“da ...
- console.log("正常-普天数据已调用");
console.log("正常-普天数据已调用");
- thinkphp框架,数据动态缓存后,或数据已读取出来,想分页怎么办
//读取缓存后赋值到数组,通过array_slice函数处理,如: $blog = S('blogname'); //赋值 $count = count($blog); //条数统计 $page = ...
- ORACLE IMPDP导入报表数据已存在
背景 搞了这么多年oracle,不论是开发和运维,自认为是都了解了,和dba差的只是熟练的问题,因为毕竟不是天天搞它.不过突然听说数据泵导入的功能,大吃一惊,好像有印象,以为是落后的,一查,竟然是先进 ...
- jquery easyui使用(三)······datagrid加载数据(已解决)
<div id="table_Data"> </div> $("#table_Data").datagrid({ toolbar: '# ...
- WCF请求数据:已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性。
通常情况下,写好WCF服务后都会用自带的WCFClient工具进行测试,在进行时数据请求的时候,如果返回数据量超过默认接收值的时候就会提示如图异常错误. 错误也提示的很清楚,无非就是修改接收值大小的问 ...
- 使用jQuery解析JSON数据-已验证
本文来源于:http://www.cnblogs.com/codeplus/archive/2011/07/18/2109544.html 上例中得到的JSON数据如下,是一个嵌套JSON: {&qu ...
- 组件内或者vuex数据已变化但是页面显示或许不正常
一.问题产生背景: 组件内的数据比较复杂,涉及多层次的数组和对象的情况下,某些值发生变化但是页面值没有变化:更新vuex的数据,同样在涉及多层次的数组和对象的情况下,某些值发生变化但是页面值没有变化: ...
- luogu P6224 [BJWC2014]数据 KD-tree 标准板子 重构+二维平面内最近最远距离查询
LINK:数据 这是一个我写过的最标准的板子. 重构什么的写的非常的标准 常数应该也算很小的. 不过虽然过了题 我也不知道代码是否真的无误 反正我已经眼查三遍了... 重构:建议先插入 插入过程中找到 ...
随机推荐
- input radio单选框样式优化
HTML代码: <form> <div> <input id="item1" type="radio" name="it ...
- zabbix系列之安全
https://blog.csdn.net/xiaoyu_0217/article/details/73500125 存在问题: 1)zabbix的Admin口令太弱或使用默认口令(Admin/zab ...
- 使用 D: 盘作为 Windows VM 上的数据驱动器
如果应用程序需要使用 D 盘存储数据,请按照以下说明使用其他驱动器号作为临时磁盘. 切勿使用临时磁盘来存储需要保存的数据. 如果调整虚拟机大小或停止(解除分配)虚拟机,这可能会触发将虚拟机放置于新虚拟 ...
- RecyclerView使用技巧(item动画及嵌套高度适配解决方案)
原文地址 · Frank-Zhu http://frank-zhu.github.io/android/2015/02/26/android-recyclerview-part-3/?utm_sou ...
- 【转】Redis学习---哈希结构内存模型剖析
[原文]https://www.toutiao.com/i6594624365906625032/ 概述 在前文<Redis字符串类型内部编码剖析>之中已经剖析过 Redis最基本的 St ...
- 乘风破浪:LeetCode真题_040_Combination Sum II
乘风破浪:LeetCode真题_040_Combination Sum II 一.前言 这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可. 二.Combination Sum ...
- Asp.net core 2.0.1 Razor 的使用学习笔记(二)
ASP.net core 2.0.1 中 asp.net identity 2.0.1 的基本使用(一)—启用用户管理 一.修改和启用默认的用户账户管理和角色管理 在Data目录中添加Applicat ...
- PyQt5--QFontDiaglog
# -*- coding:utf-8 -*- ''' Created on Sep 17, 2018 @author: SaShuangYiBing Comment: ''' import sys f ...
- [python] 列表解析式的高效与简洁
方法一(列表解析式): list1 = ["abc","efg","hij"] list2 = [i[0] for i in list1] ...
- pip安装python模块遇到一直出现retrying的问题
最近安装python模块,遇到这样的一个问题如图所示: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status= ...