C++标准库:bitset 用法整理&&zoj 3812
题意:给出N种药,每种药有两个属性,重量W,伤害值T。给出Q种疾病,每个疾病也有两个属性:重量M,伤害值S。现在要求你对每种疾病设计选择药的方案,使:1.每种要至多使用一次。2.选出的药的重量的和等于该疾病的重量,选出的药的伤害值的和等于该疾病的伤害值。如果存在方案,输出任何一个方案。否则,输出No solution.
思路:很容易想到这是恰好装满的01背包问题。但是因为T的范围为200000,同时还要输出方案,会感到无从下手。。
我们需要解决的问题有两个:因为T的范围非常大,如何保存dp的状态是个问题。同时也造成了无法直接保存最终的方案。
我们首先求出dp方程。和多重部分和问题不同,这里的选择只有01,所以我们用一个bool类型来表示方案是否存在即可。则设dp[i]j][k]表示考虑前i种药,重量之和为j,伤害值为k的方案是否存在,取值为0或1.状态转移方程为:dp[i+1][j+w[i]][k+t[i]] |= dp[i][j][k]( |= 表示位运算或)。但是,如果直接用int保存该状态,会造成空间的极大浪费。所以我们用bitset类保存该状态,即在第三维用bitset保存。 则状态转移方程为:dp[i+1][j+w[i]][k<<t[i]]
|= dp[i][j][k]。
但是,三维的dp也会爆内存,所以我们用滚动数组的方式来求最终的状态。
而对于第二个问题,我们可以用搜索的方法解决。但是因为爆搜的复杂度是2^400,根本无法进行。在这道题中,我们虽然不能把三维的数组全部开满,但是我们可以将药进行分组,每一组记录一次dp状态,最后再搜索的时候,利用记录还原方案。(自己感觉有点可持久化数据结构的味道)。
代码如下:
using namespace std;
const int MAX = 43;
const int MAXN = 410;
const int MAXA = 51;
const int MAXB = 200001;
int N,Q,T;
int tot,m,s;
int w[MAXN],t[MAXN];
bool sig;
bitset<MAXB> archive[MAX][MAXA],dp[MAXA];
int ans[MAXN],sz;
bool dfs(int n, int m, int s)
{
if(sig) return sig;
if(m == 0 && s == 0){
return sig = true;
}
int now = n / 10;
if(n % 10) now++;
if(archive[now][m][s] == 0)
return false;
if(m >= w[n] && s >= t[n]){
ans[sz++] = n;
if(!dfs(n-1,m - w[n],s - t[n]))
sz--;
}
return dfs(n-1,m,s);
}
int main(void)
{
//freopen("input.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d", &T);
while(T--){
scanf("%d %d", &N, &Q);
for(int i = 1 ; i <= N; ++i)
scanf("%d %d", &w[i],&t[i]);
for(int i = 0 ; i <= 50; ++i)
dp[i].reset();
tot = 0;
dp[0][0] = 1;
for(int i = 1; i <= N; ++i){
for(int j = 50; j >= w[i]; --j)
dp[j] |= (dp[j - w[i]]<<t[i]);
if(i == N || i % 10 == 0){
tot++;
for(int j = 0; j <= 50; ++j)
archive[tot][j] = dp[j];
}
}
while(Q--){
scanf("%d %d", &m,&s);
if(dp[m][s]){
sz = 0;
sig = false;
dfs(N,m,s);
for(int i = 0; i < sz; ++i)
printf("%d%c",ans[i],i == sz -1?'\n':' ');
}
else
puts("No solution!");
}
}
return 0;
}
</span>
C++标准库:bitset 用法整理&&zoj 3812的更多相关文章
- 把《c++ primer》读薄(3-3 标准库bitset类型)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. //开头 #include <bitset> using std::bitset; 问题1.标准库bitset类型( ...
- C++标准库 bitset
本文地址:http://www.cnblogs.com/archimedes/p/cpp-bitset.html,转载请注明源地址. 有些程序要处理二进制位的有序集,每个位可能包含 0(关)1(开)值 ...
- C++标准库bitset类型(简单使用方法)
转自此人博客 ```cpp #include<bister> using std::bitset; ``` 一句话定义:可自定义位数,用作记录二进制的数据类型. 一,定义和初始化 ```c ...
- C++ 标准库类型-String,Vector and Bitset
<C++ Primer 4th>读书摘要 最重要的标准库类型是 string 和 vector,它们分别定义了大小可变的字符串和集合.这些标准库类型是语言组成部分中更基本的那些数据类型(如 ...
- 【BZOJ 1923】1923: [Sdoi2010]外星千足虫 (高斯消元异或 | BITSET用法)
1923: [Sdoi2010]外星千足虫 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 包含一个 ...
- C++primer第三章标准库类型
除第二章介绍的基本数据类型外,C++ 还定义了一个内容丰富的抽象数据类型标准库. 本章将介绍标准库中的 vector.string 和 bitset 类型. string 类型支持长度可变的字符串 v ...
- 1.Python3标准库--前戏
Python有一个很大的优势便是在于其拥有丰富的第三方库,可以解决很多很多问题.其实Python的标准库也是非常丰富的,今后我将介绍一下Python的标准库. 这个教程使用的书籍就叫做<Pyth ...
- Primer回顾 标准库类型
string类型的输入操作符: 1.读取并忽略开头所有的空白字符(如空格,换行符,制表符). 2.读取字符直至再次遇到空白字符,读取终止. 用getline读取整行文本 getline.接受两个参 ...
- 《JavaScript语言入门教程》记录整理:运算符、语法和标准库
目录 运算符 算数运算符 比较运算符 布尔运算符 二进制位运算符 void和逗号运算符 运算顺序 语法 数据类型的转换 错误处理机制 编程风格 console对象和控制台 标准库 Object对象 属 ...
随机推荐
- codehunter 「Adera 6」杯省选模拟赛 网络升级 【树形dp】
直接抄ppt好了--来自lyd 注意只用对根判断是否哟留下儿子 #include<iostream> #include<cstdio> using namespace std; ...
- poj 1180:Batch Scheduling【斜率优化dp】
我会斜率优化了!这篇讲的超级棒https://blog.csdn.net/shiyongyang/article/details/78299894?readlog 首先列个n方递推,设sf是f的前缀和 ...
- bzoj 1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列【hash】
我%&&--&()&%????? 双模hashWA,unsigned long longAC,而且必须判断hash出来的数不能为0???? 我可能学了假的hash 这个 ...
- Akka源码分析-Akka-Streams-Materializer(1)
本博客逐步分析Akka Streams的源码,当然必须循序渐进,且估计会分很多篇,毕竟Akka Streams还是比较复杂的. implicit val system = ActorSystem(&q ...
- 洛谷 P1233 木棍加工
题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间为1分钟: 如果刚处理 ...
- CSMA/CA协议
802.11中采用CSMA/CA协议来规定多个工作节点共用信道的问题. CSMA/CA的全称是Carrier sense multiple access with collision avoidanc ...
- Manacher BestCoder Round #49 ($) 1002 Three Palindromes
题目传送门 /* Manacher:该算法能求最长回文串,思路时依据回文半径p数组找到第一个和第三个会文串,然后暴力枚举判断是否存在中间的回文串 另外,在原字符串没啥用时可以直接覆盖,省去一个数组空间 ...
- HTML基础2——综合案例2——复杂的嵌套列表
<html> <head> <title></title> </head> <body> <ul type="d ...
- java 配置信息类 Properties 的简单使用
Properties :(配置信息类) 是一个表示持久性的集合 ,继承 Hashtable ,存值是以键-值得方式 主要用于生产配置文件和读取配置文件信息. 简单的实例: import java.i ...
- Git学习笔记(0)-错误汇总
一.LF will be replaced by CRLF 1.发现问题 $ git add welcome.txt warning: LF will be replaced by CRLF in w ...