#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<set>
#define MAX_N 35
#define MAX_T 500005
using namespace std; typedef long long ll; map<ll,int> ma[2];
ll n,m,a[MAX_N],tot[2]={0,0};
ll d[2][MAX_T];
ll ans=MAX_T; void dfs(ll x,ll num,ll sum,int en,int t)
{
if(sum>m)return;
if(ma[t].find(sum)==ma[t].end())ma[t][sum]=tot[t]++;
if(d[t][ma[t][sum]]==-1)d[t][ma[t][sum]]=num;
else
d[t][ma[t][sum]]=min(d[t][ma[t][sum]],num);
if(x==en)return;
dfs(x+1,num,sum,en,t);
dfs(x+1,num+1,sum+a[x],en,t);
} int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)cin>>a[i];
memset(d,-1,sizeof(d));
dfs(0,0,0,n/2,0);
dfs(n/2,0,0,n,1); map<ll,int>::iterator it[2];
for(it[0]=ma[0].begin();it[0]!=ma[0].end();it[0]++)
{
ll tmp=m-(it[0]->first);
it[1]=ma[1].find(tmp);
if(it[1]!=ma[1].end())ans=min(ans,d[0][it[0]->second]+d[1][it[1]->second]);
}
cout<<ans<<endl;
return 0;
}

原题链接:http://codevs.cn/problem/2144/

题目描述 Description

有n个砝码,现在要称一个质量为m的物体,请问最少需要挑出几个砝码来称?

注意一个砝码最多只能挑一次

输入描述 Input Description

第一行两个整数n和m,接下来n行每行一个整数表示每个砝码的重量。

输出描述 Output Description

输出选择的砝码的总数k,你的程序必须使得k尽量的小。

样例输入 Sample Input

3 10

5

9

1

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

1<=n<=30,1<=m<=2^31,1<=每个砝码的质量<=2^30

刚开始做这道题采取了记忆化搜索的办法,但是很容易就超内存超时了。于是考虑将原数列分为两半进行搜索,记录下所有能够组成的sum及其所花的最小元素。由于我用了STL的map来记录所有的sum,所以两边的sum都是有序的,这样从前半的sum就能推出后一半所需的值,利用map可以很容易的进行搜索。

详见代码:

CODEVS_2144 砝码称重 2 折半搜索+二分查找+哈希的更多相关文章

  1. 洛谷P1441 砝码称重(搜索,dfs+bitset优化)

    洛谷P1441 砝码称重 \(n\) 的范围为 \(n \le 20\) ,\(m\) 的范围为 \(m \le 4\) . 暴力遍历每一种砝码去除情况,共有 \(n^m\) 种情况. 对于剩余砝码求 ...

  2. 洛谷P1441 砝码称重(搜索,dfs+dp)

    洛谷P1441 砝码称重 \(n\) 的范围为 \(n \le 20\) ,\(m\) 的范围为 \(m \le 4\) . 暴力遍历每一种砝码去除情况,共有 \(n^m\) 种情况. 对于剩余砝码求 ...

  3. 洛谷P1441 砝码称重

    P1441 砝码称重 题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0). 输入输出格式 输入格式: 输入文件weight.in ...

  4. codevs 2144 砝码称重2

    传送门 2144 砝码称重 2  时间限制: 1 s  空间限制: 16000 KB  题目等级 : 钻石 Diamond 题解   题目描述 Description 有n个砝码,现在要称一个质量为m ...

  5. 洛谷 P2347 砝码称重

    P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...

  6. 7行代码解决P1441砝码称重(附优化过程)

    先贴上最终代码感受一下: #include <bits/stdc++.h> using namespace std; int i, N, M, wi[21], res = 0; int m ...

  7. NOI题库--砝码称重V2(多重背包2^n拆分)

    以前只会写多重背包的原版,渣的不行,为了做此题不得不学习了一下,发现其实也不难,只要理解了方法就好多了(PS:其实和倍增挺像的) 8756:砝码称重V2 总时间限制: 1000ms 内存限制: 655 ...

  8. Codevs No.2144 砝码称重2

    2016-05-31 22:01:16 题目链接: 砝码称重2 (Codevs No.2144) 题目大意: 给定N个砝码,求称出M的重量所需砝码最小个数 解法: 贪心 使砝码数量最小,当然是每个砝码 ...

  9. 安徽省2016“京胜杯”程序设计大赛_A_砝码称重

    砝码称重 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 61 Accepted: 37 Description 小明非常喜 ...

随机推荐

  1. synchronized 和ReentrantLock的区别

    历史知识:JDK5之前,只有synchronized 可以用,之后就有了ReetrantLock可以用了 ReetrantLock (再入锁) 1.位于java.util.concurrnt.lock ...

  2. BXS入门赛部分writeup

    pwn1  盲打(笑) 前言:没有听鱼哥的话,事先没有装好环境,于是开始没做出来,然后全程在装pwntools,经过一番努力,失败了0.0 最终在网上搜了一段python socket连接脚本,终于可 ...

  3. mysql 特定查询条件下导致的大海捞针

    order表: order type  gmt_create type 取值: 0,1  其中0非常多,1非常少. 当查询条件里 select * from order where type=0 an ...

  4. 【求助】NdisSend,自定义数据包发送失败?

    做ndis hook的时候,自定义了一个数据包,包结构应该没有问题,填充NDIS_PACKET结构是这样的,先初始化:        NdisAllocatePacketPool(&nStat ...

  5. 利用React遍历数组,并且用数组的元素生成<li>arrItem</li>标签组

    var numbers = [1,2,3,4,5,6,7,8,9]; ReactDom.render({ <ul> { numbers.map(function(item){ return ...

  6. 【Gradle】Downloading https://services.gradle.org/distributions/gradle-3.3-bin.zip 失败

    提示连接超时 Downloading https://services.gradle.org/distributions/gradle-3.3-bin.zip 失败 这时候需要单独去官网下载包,然后放 ...

  7. 【css】修改placeholder 默认颜色

    html5为input添加了原生的占位符属性placeholder,高级浏览器都支持这个属性,例如: <input type="text" placeholder=" ...

  8. 【练习】reserving.kr 之Direct3D FPS

    算法函数如图,关键点在标志处,加密字符串如下图 于是写如下脚本: flag_c='436B666B62756C694C455C455F5A461C07252529701734390116494C201 ...

  9. python基础学习笔记——内置函数

    一. 简介 python内置了一系列的常用函数,以便于我们使用,python英文官方文档详细说明:点击查看, 为了方便查看,将内置函数的总结记录下来. 二. 使用说明 以下是Python3版本所有的内 ...

  10. nodejs 如何发送一个带JSON的GET请求?

    GET /megacorp/employee/_search { "aggs" : { "all_interests" : { "terms" ...