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对象 属 ...
随机推荐
- bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居【切比雪夫距离+并查集+multiset】
参考:http://hzwer.com/4361.html 坐标开long long,inf开大点 先曼哈顿转切比雪夫(x+y,x-y),距离就变成了max(x',y'): 先按x排序,维护两个指针, ...
- [Qt Quick入门] 基本元素初体验
Qt Quick作为QML语言的标准库,提供了很多基本元素和控件来帮助我们构建Qt Quick应用.这节我们简要地介绍一些Qt Quick元素,如Rectangle.Item.Text.Button. ...
- 数据结构之动态顺序表(C实现)
线性表有2种,分为顺序表和链表. 顺序表: 采用顺序存储方式,在一组地址连续的存储空间上存储数据元素的线性表(长度固定) 链表: 有3种,单链表.双向链表.循环链表(长度不固定) seqList.h ...
- ACM_区间调度问题(贪心)
Meetings 系列一 Time Limit: 2000/1000ms (Java/Others) Problem Description: 多年之后的广财ACM编协如日中天,下系多个部门,且编协成 ...
- JSON使用讲解
前端操作json 一.JSON字符串与JSON对象的区别 1. 一个对象以“{” 开始, “}”结束. 每个“名称”后跟一个“:”(冒号):“‘名称/值’ 对”之间运用 “,”(逗号) ...
- Android 性能优化(19)*代码优化11条技巧:Performance Tips
Performance Tips 1.In this document Avoid Creating Unnecessary Objects 避免多余的对象 Prefer Static Over Vi ...
- [转]ASP .NET MVC 之Entity Framework- code first
本文转自:http://www.cnblogs.com/tomin/archive/2012/02/29/MVC_EntityFramework.html 最近,用到了ASP.NET MVC Ent ...
- Matlab2014的下载和安装激活过程
Matlab2014的下载和安装过程 转载自csdn https://blog.csdn.net/hp910315/article/details/70197149 1 下载Matlab2014,下 ...
- python __slots__ 详解(上篇)
转自:http://blog.csdn.net/sxingming/article/details/52892640 python中的new-style class要求继承Python中的一个内建类型 ...
- Spring+Spring MVC+Hibernate环境搭配
Spring+Spring MVC+Hibernate简称"SSH".Spring容器是Spring的核心,该 容器负责管理spring中的java组件.Spring的核心机制:依 ...