CODEVS2144 砝码称重2 (哈希表)
由于m很大,所以不能使用DP。
注意到n≤30,直接暴力2^n会TLE。
所以,将砝码平均分成两份,对一份进行一次暴力,用哈希表存下可能的结果。
对下一份再进行一次暴力,在哈希表中搜索剩余的砝码重量是否存在,若存在则更新答案。
输出最小答案即可。
Program CODEVS2144;
const maxn=;
maxh=;
var a:array[..maxn] of longint;
n,i,ans:longint;
m:int64;
h:array[..maxh,..] of longint;
procedure insert(x,y:longint);
var hash:longint;
begin
hash:=x mod maxh;
while (h[hash,]<>-) and (h[hash,]<>x) do
hash:=(hash+) mod maxh;
if h[hash,]=- then
begin
h[hash,]:=x;
h[hash,]:=y;
end
else
if y<h[hash,] then h[hash,]:=y;
end;
function find(x:longint):longint;
var hash:longint;
begin
hash:=x mod maxh;
while (h[hash,]<>-) and (h[hash,]<>x) do
hash:=(hash+) mod maxh;
if h[hash,]=- then exit() else
exit(h[hash,]);
end;
procedure dfs(x:longint;sum:int64;num:longint);
begin
if sum>m then exit;
if x=n div + then
begin
insert(sum,num);
exit;
end;
dfs(x+,sum,num);
dfs(x+,sum+a[x],num+);
end;
procedure work(x:longint;sum:int64;num:longint);
var j:longint;
begin
if sum>m then exit;
if x=n+ then
begin
if sum=m then
begin
if num<ans then ans:=num;
exit;
end;
j:=find(m-sum);
if j<> then
begin
if j+num<ans then
ans:=j+num;
end;
exit;
end;
work(x+,sum,num);
work(x+,sum+a[x],num+);
end;
begin
for i:= to maxh do h[i,]:=-;
readln(n,m);
for i:= to n do readln(a[i]);
ans:=maxn;
dfs(,,);
work(n div +,,);
writeln(ans);
end.
CODEVS2144 砝码称重2 (哈希表)的更多相关文章
- NOI题库--砝码称重V2(多重背包2^n拆分)
以前只会写多重背包的原版,渣的不行,为了做此题不得不学习了一下,发现其实也不难,只要理解了方法就好多了(PS:其实和倍增挺像的) 8756:砝码称重V2 总时间限制: 1000ms 内存限制: 655 ...
- Codevs No.2144 砝码称重2
2016-05-31 22:01:16 题目链接: 砝码称重2 (Codevs No.2144) 题目大意: 给定N个砝码,求称出M的重量所需砝码最小个数 解法: 贪心 使砝码数量最小,当然是每个砝码 ...
- 安徽省2016“京胜杯”程序设计大赛_A_砝码称重
砝码称重 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 61 Accepted: 37 Description 小明非常喜 ...
- P2347 砝码称重-DP方案数-bitset
P2347 砝码称重 DP做法 : 转化为 01背包. 进行方案数 更新.最后统计种类. #include<bits/stdc++.h> using namespace std; #def ...
- 51nod 1449 砝码称重 (进制思想)
1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 现在有好多种砝码,他们的重量是 w0,w1,w ...
- 51nod 1837 砝码称重【数学,规律】
题目链接:51nod 1837 砝码称重 小 Q 有 n 个砝码,它们的质量分别为 1 克. 2 克.……. n 克. 他给 i 克的砝码标上了编号 i (i = 1, 2, ..., n),但是编号 ...
- P2347 砝码称重
P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...
- Codevs 2144 砝码称重 2
2144 砝码称重 2 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 有n个砝码,现在要称一个质量为m ...
- 洛谷P1441 砝码称重
P1441 砝码称重 题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0). 输入输出格式 输入格式: 输入文件weight.in ...
随机推荐
- E20171014-hm
Sibling n. 兄弟,姐妹; [生] 同科,同属; [人] 氏族成员;
- Rails mysql数据库连接的小坑
基本上直接clone下来的话,数据库连接必失败. 注意,把用户名密码写在.env文件下
- 仪表盘(Speedometer) icon 设计
- 零基础如何学习Java和web前端
今天说一下零基础到底能不能学习Java,为什么有的人说学不了呢,那么接下来我为大家揭晓,零基础到底适合不适合学习Java. 零基础学习Java的途径第一个就是看视频,然后就是看书,或者在线下报个培训班 ...
- 在3D中两条射线的相交性检测
摘自[3D数学基础: 图形与游戏开发] 考虑在3D中两条以参数形式定义的射线: \(\vec{r_1}(t_1)=\vec{p_1}+t_1\vec{d_1}\) \(\vec{r_2}(t_2)=\ ...
- ansible基础知识(二)
软件相关模块 yum yum和rpm的区别 rpm: (Redhat package manager)RPM管理支持事务机制.增强了程序安装卸载的管理. yum: YUM被称为 Yellow dog ...
- Elasticsearch之sense插件安装之后的浏览详解
前提博客是 Elasticsearch之sense插件的安装(图文详解) 立马,可以看到 http://192.168.80.145:5601/app/sense 以后更新
- 2 我们的C#学习方法
在这里我们借鉴了一种行之有效的学习编程语言的方法,并在此基础上进行了相应的改良.我们在培训新人中使用后,发现这种学习方法是非常有效的. 你通过做以下几个步骤来一步步学习C#语言. 1. 搞懂每一个我们 ...
- Spring Cloud (4) 服务消费者-Feign
Spring Cloud Feign Spring Cloud Feign 是一套基于Netflix Feign实现的声明式服务调用客户端.它使得编写Web服务客户端变得更加简单,我们只需要创建接口并 ...
- 背包系列 hdu3449 有依赖背包
这道题真正困扰了笔者3,4天,冥思苦想几日无果之后,只能去找大牛的解法.结合网上的大牛解法与自己的理解,笔者终于解决了这个坑了,在此小庆幸一下. 原题如下: Consumer Time Limit: ...