wikioi 2144 分步二进制枚举+map记录
题目描写叙述 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记录的更多相关文章
- UVa 818 切断圆环链(dfs+二进制枚举)
https://vjudge.net/problem/UVA-818 题意:有n个圆环,其中有一些已经扣在了一起.现在需要打开尽量少的圆环,使得所有圆环可以组成一条链,例如,有5个圆环,1-2,2-3 ...
- Consonant Fencity Gym - 101612C 暴力二进制枚举 Intelligence in Perpendicularia Gym - 101612I 思维
题意1: 给你一个由小写字母构成的字符串s,你可以其中某些字符变成大写字母.如果s中有字母a,你如果想把a变成大写,那s字符串中的每一个a都要变成A 最后你需要要出来所有的字符对,s[i]和s[i-1 ...
- Poj(2784),二进制枚举最小生成树
题目链接:http://poj.org/problem?id=2784 Buy or Build Time Limit: 2000MS Memory Limit: 65536K Total Sub ...
- hdu 3118(二进制枚举)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3118 思路:题目要求是去掉最少的边使得图中不存在路径长度为奇数的环,这个问题等价于在图中去掉若干条边, ...
- HDU 5025Saving Tang Monk BFS + 二进制枚举状态
3A的题目,第一次TLE,是因为一次BFS起点到终点状态太多爆掉了时间. 第二次WA,是因为没有枚举蛇的状态. 解体思路: 因为蛇的数目是小于5只的,那就首先枚举是否杀死每只蛇即可. 然后多次BFS, ...
- poj-3279 poj-1753(二进制枚举)
题目链接:http://poj.org/problem?id=3279 题目大意: 有一个m*n的棋盘(1 ≤ M ≤ 15; 1 ≤ N ≤ 15),每个格子有两面分别是0或1,每次可以对一个格子做 ...
- POJ 3279 Fliptile (二进制枚举)
<题目链接> <转载于 >>> > 题目大意: 给定一个M*N矩阵,有些是黑色(1表示)否则白色(0表示),每翻转一个(i,j),会使得它和它周围4个格变为另 ...
- HDU 4309 Seikimatsu Occult Tonneru(最大流+二进制枚举)
http://acm.hdu.edu.cn/showproblem.php?pid=4309 题意: 有n个城市,每个城市有num[i]个居民,有敌人要进行地毯式轰击,居民们要逃到隧道去.现在有隧道, ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛-B:Tomb Raider(二进制枚举)
时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Lara Croft, the fiercely independent daughter of a missing adv ...
随机推荐
- 【usaco 2013 open yinyang】阴阳
题目 Farmer John 正在在计划自己的农场漫步.他的农场的结构就像一棵树:农场有N个谷仓(1<= N <=100,000),分别由N-1条路链接.这样,他便可以通过这些谷仓间的道路 ...
- LeetCode--079--单词搜索(python)
给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被重复使用. ...
- KCF跟踪算法
参考:https://www.cnblogs.com/YiXiaoZhou/p/5925019.html 参考:https://blog.csdn.net/shenxiaolu1984/article ...
- python+selenium实现发送一封带附件的邮件
163邮件登录首页 登录成功断言是否有退出按钮 点击退出退出登录 from selenium import webdriver import unittest import time class Vi ...
- codevs 1160 蛇形矩阵x
题目描述 Description 小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该 ...
- .NET(c#) 移动APP开发平台 - Smobiler(2) - 平台介绍
看到大家很多人在后台问我一些问题,所以准备写一个系列了,下面给个目录 目录: .NET(c#) 移动APP开发平台 - Smobiler(1) 环境的搭建及上手第一个应用 类似开发WinForm的方式 ...
- RedHat下使用gcc编译HelloWorld.cpp
gcc ./HelloWorld.cpp 错误: /tmp/ccZuz3Ca.o:(.eh_frame+0x12): undefined reference to `__gxx_personality ...
- 基于自定义的动态数组实现一个栈(Java语言)
关于动态数组,参见我的上一篇关于动态数组的博文https://www.cnblogs.com/inu6/p/11717129.html 1.什么是栈? (1)只能从一端添加元素,也只能从一端取出元素, ...
- vue 使用props 实现父组件向子组件传数据
刚自学vue不久遇到很多问题,刚好用到的分组件,所以就用到传递数据 弄了好久终于搞定了,不多说直接上代码 父组件: <template> <headers :inputName=&q ...
- 《SQL Server 2012 T-SQL基础》读书笔记 - 2.单表查询
Chapter 2 Single-Table Queries GROUP BY之后的阶段的操作对象就是组(可以把一组想象成很多行组成的)了,HAVING负责过滤掉一些组.分组后的COUNT(*)表示每 ...