这是一道比赛时的题目,但由于我没报名,所以浪费了一个大好的切水题的机会。

  是经典的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 购物券Ⅰ(数据已加强)的更多相关文章

  1. vue数据已渲染成 但还是报错 变量 undefined

    问题:页面上的数据已渲染出来,但是控制台还是报错变量未undefined,主要是当页面加载完成后,数据并未加载完,所以会报次错误. 解决办法:在数据渲染的主节点(最外层的div)添加 v-if=“da ...

  2. console.log("正常-普天数据已调用");

    console.log("正常-普天数据已调用");

  3. thinkphp框架,数据动态缓存后,或数据已读取出来,想分页怎么办

    //读取缓存后赋值到数组,通过array_slice函数处理,如: $blog = S('blogname'); //赋值 $count = count($blog); //条数统计 $page = ...

  4. ORACLE IMPDP导入报表数据已存在

    背景 搞了这么多年oracle,不论是开发和运维,自认为是都了解了,和dba差的只是熟练的问题,因为毕竟不是天天搞它.不过突然听说数据泵导入的功能,大吃一惊,好像有印象,以为是落后的,一查,竟然是先进 ...

  5. jquery easyui使用(三)······datagrid加载数据(已解决)

    <div id="table_Data"> </div> $("#table_Data").datagrid({ toolbar: '# ...

  6. WCF请求数据:已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性。

    通常情况下,写好WCF服务后都会用自带的WCFClient工具进行测试,在进行时数据请求的时候,如果返回数据量超过默认接收值的时候就会提示如图异常错误. 错误也提示的很清楚,无非就是修改接收值大小的问 ...

  7. 使用jQuery解析JSON数据-已验证

    本文来源于:http://www.cnblogs.com/codeplus/archive/2011/07/18/2109544.html 上例中得到的JSON数据如下,是一个嵌套JSON: {&qu ...

  8. 组件内或者vuex数据已变化但是页面显示或许不正常

    一.问题产生背景: 组件内的数据比较复杂,涉及多层次的数组和对象的情况下,某些值发生变化但是页面值没有变化:更新vuex的数据,同样在涉及多层次的数组和对象的情况下,某些值发生变化但是页面值没有变化: ...

  9. luogu P6224 [BJWC2014]数据 KD-tree 标准板子 重构+二维平面内最近最远距离查询

    LINK:数据 这是一个我写过的最标准的板子. 重构什么的写的非常的标准 常数应该也算很小的. 不过虽然过了题 我也不知道代码是否真的无误 反正我已经眼查三遍了... 重构:建议先插入 插入过程中找到 ...

随机推荐

  1. Expo大作战(七)--expo如何使用Genymotion模拟器

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...

  2. Mbps Mb M Kb如何换算

    在传输单位的写法上,B 和 b 分别代表 Bytes 和 bits,两者的定义是不同的,具体换算公式如下:1 Byte = 8 bits 1 Kb = 1024 bits 1 KB = 1024 by ...

  3. extends CakeRequest,重写is方法

    背景:Cakephp开发环境版本是2.3.8,服务器的cakephp版本是2.3.5,测试好的代码上传到服务器上后发现总爆如下的警告: Warning (2): strtolower() expect ...

  4. Jboss 4.2.3配置与优化

    1      Jboss内存优化 修改这个两参数,给jvm分配适当的内存,一般为服务器的3/4内存量,推荐至少使用4G内存. 另外添加两个参数 -XX:+UseParallelGC -XX:+UseP ...

  5. Python3部分Print输出格式

    print("Hello World!") #直接打印字符串 print('Hello World!') #对于python,单引号也可以表示字符串 name = 'Tom' #自 ...

  6. Centos kernel panic-not syncing:VFS:Unable to mount root fs on unknown block 解决办法

    昨晚更新了一下内核,今晚开机就无法进系统了...提示如下图: 解决方案:开机启动时按Esc,然后选择下面的旧版本的内核启动即可. (成功进入系统后,你可以选择改变开机默认选择的内核). uname - ...

  7. VMware虚拟机打开后不兼容

    在版本VMware Workstation10.0设置兼容性,在编辑——首选项——工作空间——设置EXS兼容.计算机工作区域打开虚拟机,右键管理.兼容性从新配置

  8. 1.1环境的准备(一)之Python解释器的安装

    目录: 1.Python-解释器的下载 2.Python-解释器的安装 3.Python-解释器的测试 4.Python的环境变量的配置 (一)Python解释器的安装: 1.官网:https://w ...

  9. 读高性能JavaScript编程 第四章 Duff's Device

    又要开始罗里吧嗦的 第四章  Summary 了. 这一次我尽量精简语言. 如果你认为 重复调用一个方法数次有点辣眼睛的话 比如: function test(i){ process(i++); pr ...

  10. FZU Monthly-201901 获奖名单

    FZU Monthly-201901 获奖名单 冠军: S031702338 郑学贵 一等奖: S031702524 罗继鸿 S031702647 黄海东 二等奖: S031702413 韩洪威 S0 ...