题目描写叙述 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

思路:这题刚開始用了搜索。不机智T了又WA了。然后又一次回到二进制枚举上来吧。

刚開始读题的时候想用二进制枚举了,可是无奈n<=30。2^30早就T了,所以用不了二进制枚举。

搜索又T又WA的,然后仅仅好看了一下解题报告。里面说了用二进制枚举,可是分块来枚举就不会T了。呀!真是太机智了大神们!!

由于最多有30个数。而他们的组合都会非常大的,可是假设我们先搞先n/2个数的组合,然后再搞后(n+1)/2个数的组合的话。然后再把前后合成,就不会T了,并且也能够保证前后组合后与标准的组合是一样的。分治的思想。

二进制又进步了非常多,曾经是20下面的才敢二进制枚举。如今20以上的用了分治思想后也能够用二进制枚举了。历害。。!

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
int main()
{
int n,m,a[33],i,j,ans=1000000007;
map<int,int>mm;
cin>>n>>m;
for(i=0;i<n;i++)
cin>>a[i];
for(i=1;i<(1<<(int)(n/2+1));i++)
{
int sum=0,cnt=0;
for(j=0;j<n/2;j++)
if(i&(1<<j)) sum+=a[j],cnt++;
if(!mm[sum]||cnt<mm[sum]) mm[sum]=cnt;
}
if(mm[m]) ans=mm[m];
for(i=1;i<(1<<(int)((n+1)/2+1));i++)
{
int sum=0,cnt=0;
for(j=0;j<(n+1)/2;j++)
if(i&(1<<j)) sum+=a[j+n/2],cnt++;
if(sum==m) ans=min(ans,cnt);
if(mm[m-sum]) ans=min(ans,mm[m-sum]+cnt);
}
cout<<ans<<endl;
return 0;
}

wikioi 2144 分步二进制枚举+map记录的更多相关文章

  1. UVa 818 切断圆环链(dfs+二进制枚举)

    https://vjudge.net/problem/UVA-818 题意:有n个圆环,其中有一些已经扣在了一起.现在需要打开尽量少的圆环,使得所有圆环可以组成一条链,例如,有5个圆环,1-2,2-3 ...

  2. Consonant Fencity Gym - 101612C 暴力二进制枚举 Intelligence in Perpendicularia Gym - 101612I 思维

    题意1: 给你一个由小写字母构成的字符串s,你可以其中某些字符变成大写字母.如果s中有字母a,你如果想把a变成大写,那s字符串中的每一个a都要变成A 最后你需要要出来所有的字符对,s[i]和s[i-1 ...

  3. Poj(2784),二进制枚举最小生成树

    题目链接:http://poj.org/problem?id=2784 Buy or Build Time Limit: 2000MS   Memory Limit: 65536K Total Sub ...

  4. hdu 3118(二进制枚举)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3118 思路:题目要求是去掉最少的边使得图中不存在路径长度为奇数的环,这个问题等价于在图中去掉若干条边, ...

  5. HDU 5025Saving Tang Monk BFS + 二进制枚举状态

    3A的题目,第一次TLE,是因为一次BFS起点到终点状态太多爆掉了时间. 第二次WA,是因为没有枚举蛇的状态. 解体思路: 因为蛇的数目是小于5只的,那就首先枚举是否杀死每只蛇即可. 然后多次BFS, ...

  6. poj-3279 poj-1753(二进制枚举)

    题目链接:http://poj.org/problem?id=3279 题目大意: 有一个m*n的棋盘(1 ≤ M ≤ 15; 1 ≤ N ≤ 15),每个格子有两面分别是0或1,每次可以对一个格子做 ...

  7. POJ 3279 Fliptile (二进制枚举)

    <题目链接> <转载于 >>> > 题目大意: 给定一个M*N矩阵,有些是黑色(1表示)否则白色(0表示),每翻转一个(i,j),会使得它和它周围4个格变为另 ...

  8. HDU 4309 Seikimatsu Occult Tonneru(最大流+二进制枚举)

    http://acm.hdu.edu.cn/showproblem.php?pid=4309 题意: 有n个城市,每个城市有num[i]个居民,有敌人要进行地毯式轰击,居民们要逃到隧道去.现在有隧道, ...

  9. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛-B:Tomb Raider(二进制枚举)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Lara Croft, the fiercely independent daughter of a missing adv ...

随机推荐

  1. ionic icon(图标)

    https://www.runoob.com/ionic/ionic-icon.html ionic 也默认提供了许多的图标,大概有 700 多个,针对 Android 和 iOS 有不同的样式.

  2. Bugku 杂项 宽带信息泄露

    宽带信息泄露 flag是宽带用户名 下载文件后用RouterPassView打开,搜索username即可

  3. 舞蹈课(dancingLessons)

    有n个人参加一个舞蹈课.每个人的舞蹈技术由整数ai来决定.在舞蹈课的开始,他们从左到右站成一排.当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞.如果相差最小的不止一对,那么 ...

  4. CG-CTF | Hello,RE!

    菜狗开始向着pwn与re进军了(●'◡'●)[说白了,还是在水博客吧] 按r出flag: galf    leW{    emoc    _oT_    W_ER  dlro   }! 反一下:fla ...

  5. p2p传输协议

    老司机是如何飙车的——P2P传输协议 转载来自2017-03-27 15:23 点波蓝字关注变智者 秋明山上人行稀,常有车手较高低,如今车道依旧在,不见当年老司机.其实老司机们从未离去,只不过好的车手 ...

  6. Hbase——HA搭建

    架构 master1,2 免秘钥登录 配置环境变量export HBASE_HOME=/root/hbase-0.99.2export PATH=$PATH:$HBASE_HOME/bin 修改配置文 ...

  7. 012-elasticsearch5.4.3【五】-搜索API【一】搜索匹配所有matchAllQuery、全文查询[matchQuery、multiMatchQuery、commonTermsQuery、queryStringQuery、simpleQueryStringQuery]

    一.概述 查询所使用的 QueryBuilders来源于以下 import static org.elasticsearch.index.query.QueryBuilders.*; 请注意,您可以使 ...

  8. Oracle-优化SQL语句

    建议不使用(*)来代替所有列名 用truncate代替delete 在SQL*Plus环境中直接使用truncate table即可:要在PL/SQL中使用,如: 创建一个存储过程,实现使用trunc ...

  9. Cannot refer to the non-final local variable user defined in an enclosing scope

    (1)首先该错误只会在 JDK 1.7 版本及其以前如果要在匿名内部类中报出,解决办法为在传入的参数前面增加final修饰,但如果在JDK 如果变更为1.8版本及其以后,该异常就不存在了. (2)如何 ...

  10. Delphi 跨单元进入(访问)类的私有成员,protected ,private部分

    http://blog.sina.com.cn/s/blog_5f8861b60102v1nl.html Delphi 跨单元进入(访问)类的私有成员,protected ,private部分 (20 ...