题目描写叙述 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. 如何保证Redis与数据库的数据一致性

    一般来说,只要你用到了缓存,不管是Redis还是memcache,就可能会涉及到数据库缓存与数据的一致性问题,这里我们以Redis为例. 我们该如何保证Redis与数据库的一致性呢? So easy: ...

  2. 进程队列补充、socket实现服务器并发、线程完结

    目录 1.队列补充 2.关于python并发与并行的补充 3.TCP服务端实现并发 4.GIL全局解释器锁 什么是保证线程安全呢? GIL与Lock 5.验证多线程的作用 对结论的验证: 6.死锁现象 ...

  3. IIS6、IIS7.5设置网站默认首页方法(Directory Listing Denied)

    这篇文章主要介绍了IIS6.IIS7.5设置网站默认首页方法,如果不设置访问目录就会提示Directory Listing Denied,就是不允许列出文档,为了安全网站都会设置不设置默认,需要的朋友 ...

  4. [HG]AK 题解

    前言 什么鬼畜玩意,扶我起来,我要用__int128,这辈子都不珂能用龟速乘的... 真香. 题解 我们知道这个模数是个神奇的东西 \(2305843008676823040 = 2^{29} \ti ...

  5. UE4从4.15移植到4.16

    如果是旧版本的工程需要移植到4.16,有几个地方需要修改: 假设RC是工程名,修改如下(三个CS文件) 类似的,插件也需要这样修改

  6. [CSP-S模拟测试]:串串香(KMP)

    题目传送门(内部题75) 输入格式 输入文件$ccx.in$ 每个输入文件包含多组测试数据.输入文件的第一行为一个整数$T$,表示数据组数.接下来$T$行,每行表示一组测试数据 每行一开始,两个空格隔 ...

  7. ES6 嵌套数组进行解构

    let [foo, [[bar], baz]] = [1, [[2], 3]]; foo // 1 bar // 2 baz // 3 let [ , , third] = ["foo&qu ...

  8. Netflow elasticflow

    http://itfish.net/article/27660.html https://github.com/robcowart/elastiflow/tree/master

  9. 【转】一个 Vim 重度用户总结的 vim 超全指南

    [转]一个 Vim 重度用户总结的 vim 超全指南 我本人是 Vim 的重度使用者,就因为喜欢上这种双手不离键盘就可以操控一切的feel,Vim 可以让我对文本的操作更加精准.高效. 对于未使用过 ...

  10. ssh连接MAC服务器显示No route to host解决方法

    首先MAC操作系统是10 其它电脑通过ssh访问一台mac服务器时,有时候可以登录进去,有显示显示no route to host 并且通过浏览器访问布署在mac上的jenkins,反应奇慢,后来做了 ...