编程练习赛11B 物品价值(装压dp)
题意:每个物品有m(m<=10)种属性和一个价格,你有n种物品从中任意选择一些物品,让每种属性恰好有奇数个物品拥有,输出满足条件的最大价值和
题解:一看就是明显的01背包问题,但是价格乘以个数的平方太大了,所有无法直接枚举价格进行背包
首先可以发现只分成奇数与偶数、而且m很小,所以可以对于每个物品的属性使用二进制压缩,此位有这个属性就变成1,否则为0
然后因为同奇同偶相加为偶、否则为奇,类似异或的规则,所以两个物品和在一起就是用两个压缩数进行异或
最后可以发现虽然不能枚举价格,但是压缩后的数只能是0到1023、这1024种可能,所以可以先枚举个数n,再枚举压缩后的数
注意代码中写的几个点
#include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include<vector> #include<string> #include<cstdio> #include<cstring> #include<iomanip> #include<stdlib.h> #include<iostream> #include<algorithm> using namespace std; #define eps 1E-8 /*注意可能会有输出-0.000*/ #define sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型 #define cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化 #define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0 #define mul(a,b) (a<<b) #define dir(a,b) (a>>b) typedef long long ll; typedef unsigned long long ull; const int Inf=1<<30; const ll INF=1LL<<60; const double Pi=acos(-1.0); const int Mod=1e9+7; const int Max=1050; int dp[Max][Max]; int num[Max],value[Max]; int Solve(int n,int m) {for(int i=0; i<n; ++i){for(int j=1; j<(1<<m); ++j){if(j)dp[i][j]=-Inf;else//必须是从0开始dp[i][j]=0;}}int res=0;for(int i=1; i<=n; ++i){for(int j=0; j<(1<<m); ++j){dp[i][j]=max(dp[i-1][j],dp[i-1][j^num[i]]+value[i]);//注意动归方程式 }res=max(res,dp[i][(1<<m)-1]);}return res; } int main() {int t;int n,m;scanf("%d",&t);while(t--){scanf("%d %d",&n,&m);int temp,temp2;for(int i=1; i<=n; ++i){scanf("%d %d",&value[i],&temp);num[i]=0;for(int j=0; j<temp; ++j){scanf("%d",&temp2);num[i]=(num[i]|(1<<(temp2-1)));//使用的是按位或 }}printf("%d\n",Solve(n,m));}return 0; }
转载于:https://www.cnblogs.com/zhuanzhuruyi/p/6623547.html
编程练习赛11B 物品价值(装压dp)相关推荐
- 牛客练习赛$18E\ pocky$游戏 状压$dp$
正解:状压$dp$ 解题报告: 传送门$QwQ$ 首先注意下题目,这个$a_i$不是个排列,,,我开始想了好久说这不是傻逼题直接做嘛然后一看样例发现我是傻逼$/dk$ 一个套路,看到绝对值问题一般就是 ...
- [转]状态压缩dp(状压dp)
状态压缩动态规划(简称状压dp)是另一类非常典型的动态规划,通常使用在NP问题的小规模求解中,虽然是指数级别的复杂度,但速度比搜索快,其思想非常值得借鉴. 为了更好的理解状压dp,首先介绍位运算相关的 ...
- codeforces 8C. Looking for Order 状压dp
题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...
- 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP
[题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...
- CodeForces - 1550E Stringforces(二分+状压dp)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,只包含前 kkk 个小写字母以及通配符 ???,现在可以将通配符替换成任意的前 kkk 个字母中的一个.设 f[i]f[i]f[i] 为 ...
- hdu 6149 Valley Numer II(01背包套状压dp)
题目链接:hdu 6149 Valley Numer II 题意: 给你N个点,有k个为高点,其他为低点,现在这N个点有m条边,问你最多能组成多少个两个高点一个低点,低点和两个高点都有边相连这样的状态 ...
- Gym - 101853E E. Maximum Sum (状压DP)
原题地址:https://codeforces.com/gym/101853/problem/E 题意:给出一个n*n的矩阵,矩阵中每一个格子都有一个权值,选择一个格子就能拿到当前的权值,但是同时就不 ...
- 最简真分数c语言,HihoCoder1655 : 第K小最简真分数([Offer收割]编程练习赛39)(唯一分解+容斥定理+二分)(不错的数学题)...
描述 给一个整数N,请你求出以N为分母的最简(既约)真分数中第K小的是多少? 输入 两个整数N个K. 对于30%的数据,1 <= N <= 1000000 对于100%的数据,1 < ...
- NOJ 1116 哈罗哈的大披萨 【淡蓝】 [状压dp+各种优化]
我只能说,珍爱生命,远离卡常数的题...感谢陈老师和蔡神,没有他们,,,我调一个星期都弄不出来,,,, 哈罗哈的大披萨 [淡蓝] 时间限制(普通/Java) : 1000 MS/ 3000 MS ...
最新文章
- 深度学习框架Caffe2并入PyTorch,你的开发效率可能要提升不少
- COUNT(*)计算行数有哪些优化手段
- 电子科技大学沙河计算机就业,电子科技大学沙河的几个软件工程有什么区别?...
- 在浏览器输入URL回车之后发生了什么
- 【模板】最小割树(Gomory-Hu Tree)
- Kubernetes 核心概念
- Hyper-V 2016 系列教程48 Windows Server Backup 一次性备份操作
- DevExpress v17.2新版亮点—WinForms篇(四)
- azure第一个月_MLOps:两个Azure管道的故事
- map集合的putall_Map.put和Map.putAll方法之间的区别?
- 电机入门之路系列1--减速步进电机的原理
- SAP License:当变态的与病态的需求来临,你是否说不?
- Visio—如何画虚线?
- 二维码的原理竟如此简单,第一次有人说的这么明白
- 青春散场,挚爱郭敬明(一草著)【连载二】
- 在evaluate用到coco-caption时出现subprocess无法创建的错误
- 原创 使用docker 安装CVAT并使用
- 750px媒体查询 1rem=100px
- windows 本地搭建git仓库_Windows平台下Github远程仓库的搭建-Go语言中文社区
- APP流量变现之穿山甲广告平台接入
热门文章
- python:threading.Thread类的使用详解
- git 21天打卡day10-创建昵称分支并切换
- 超详细 | 接口自动化测试总结与分享入门篇
- mysql备份脚本 shell_MySQL数据库备份Shell脚本
- tidb 企业_TiDB,日均千万级数据存储方案选型
- php表单转json对象,form表单转Json提交的方法(推荐)
- linux socket closeconnection,求助:socket的Connection refused
- ElasticFusion: Real-Time Dense SLAM and Light Source Estimation
- 基于深度学习的农作物病害检测
- 如何做相册_苹果手机相册不想让人看怎么办?看这里教你加密