SNNU女装T台走秀(状压dp)
呜啦啦啦啦啦啦~~!!SNNU首届女装T走秀大赛开始了!
本次比赛共有N名队员希望参加比赛;ddjing希望这次比赛尽可能的吸睛,因此他决定对N名队员进行一次海选;
多亏ddjing有一双发现美的眼睛,他发现,每个人都有一个乃至多个的个性,ddjing把这些个性编号为1~M(1<=M<=10);此外,他还发现,每个人都有自己的魅力值Q(1<=Q<=1000)。
ddjing有很严重的强迫症,乃至强迫癌晚期,因此通过这次选拔后,他希望每种个性都只能出现奇数次;在这种前提下,本次女装大赛的出场人员魅力值总和最大是多少?
输入
第一行一个数T(1<=T<=50),表示数据组数。对于每一组数据:
第一行两个数N,M(1<=N<=1000,1<=M<=10)
接下来每两行描述一名参赛人员。对于每一名参赛人员:
第一行两个数Q和S,表示其魅力和所含个数数量(1<=Q<=1000,1<=<S<=M)
第二行S个数,表示他拥有的个性编号(1<=编号<=M)
输出
输出本次比赛的出场人员魅力总和最大值,不存在则输出-1。
样例输入
1
3 2
2 1
1
2 1
2
5 2
1 2
样例输出
5
题解思路:
将每个人的个性压缩成二进制位,通过异或来判断出现次数的奇偶,然后用这个数当成物品的体积,最终状态为2^m -1,这样就可以将问题转化成01背包。
由于是异或背包,所以直接用一维数据有可能导致某些“物品”或者“容量”被重复操作,因此至少需要2个数组来保存上一状态和当前状态,为了不再增加题目代码量,所以不对空间进行限制,可以使用n*2^m 的空间。
背包初始状态bag[0][0]=0,其余为-1,表明该状态目前不可达,也就是说,该状态暂时没有后继。
#include<bits/stdc++.h>
using namespace std;
int t,n,m,bag[][],q,s;//第二维大于1024即可
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
memset(bag,-,sizeof bag);
bag[][]=;
int goal=<<m;
for(int i=;i<=n;i++){
scanf("%d%d",&q,&s);
int w=;
for(int j=;j<s;j++){
int c;
scanf("%d",&c);
w|=<<(c-);//因为序号是从1开始的
}
for(int j=;j<goal;j++){
if(bag[i-][j]==-) continue;
bag[i][j^w]=max(bag[i][j^w],bag[i-][j]+q);
bag[i][j]=max(bag[i][j],bag[i-][j]);
}
}
printf("%d",bag[n][goal-]);
}
return ;
}
SNNU女装T台走秀(状压dp)的更多相关文章
- 状压DP天秀
状压DP,依靠的是把状态用某种压缩方式表示出来进而DP,大多数时候是二进制状压. 直接看例题吧. 一双木棋 九尾狐吃棉花糖 islands and bridges 愤怒的小鸟 芯片 ...
- 『公交线路 状压dp 矩阵乘法加速』
公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的 ...
- 【BZOJ2073】[POI2004]PRZ 状压DP
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
- 【BZOJ-1097】旅游景点atr SPFA + 状压DP
1097: [POI2007]旅游景点atr Time Limit: 30 Sec Memory Limit: 357 MBSubmit: 1531 Solved: 352[Submit][Sta ...
- hdu 4856 Tunnels (bfs + 状压dp)
题目链接 The input contains mutiple testcases. Please process till EOF.For each testcase, the first line ...
- UVa 11825 (状压DP) Hackers' Crackdown
这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...
- HDU 4284Travel(状压DP)
HDU 4284 Travel 有N个城市,M条边和H个这个人(PP)必须要去的城市,在每个城市里他都必须要“打工”,打工需要花费Di,可以挣到Ci,每条边有一个花费,现在求PP可不可以从起点1 ...
- Travel(HDU 4284状压dp)
题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走, ...
- codeforces 21D. Traveling Graph 状压dp
题目链接 题目大意: 给一个无向图, n个点m条边, 每条边有权值, 问你从1出发, 每条边至少走一次, 最终回到点1. 所走的距离最短是多少. 如果这个图是一个欧拉回路, 即所有点的度数为偶数. 那 ...
随机推荐
- 八大排序算法原理以及Java实现(直接插入排序)
概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...
- deep learning 学习笔记(三) 线性回归学习速率优化寻找
继续学习http://www.cnblogs.com/tornadomeet/archive/2013/03/15/2962116.html,上一节课学习速率是固定的,而这里我们的目的是找到一个比较好 ...
- ajax返回的值有两种方法,一种是把async:true改为false。 另一种是回调函数。
function load_val(callback){//定义一个回调函数 $.getJSON('test.php' , function(dat){ callback(data);//将返回结果当 ...
- hdu-1012-u Calculate e(水题)
#include <iostream> using namespace std; int main() { ]; jiecheng[] = jiecheng[] = ; ; i<; ...
- MKMapView缩放显示全部annotation(转)
原文 http://blog.csdn.net/favormm/article/details/8028026#define MINIMUM_ZOOM_ARC 0.014 //approximate ...
- Python with 结构
一段基本的 with 表达式,其结构是这样的: with EXPR as VAR: BLOCK EXPR 可以是任意表达式: as VAR 是可选的.其一般的执行过程是这样的: 计算 EXPR ,并获 ...
- mysql索引攻略
本设计和优化专题转自博客园的Mysql的设计和优化专题 Explain优化查询检测 所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后 ...
- @Override重写
package com.wisezone.f; //父类 public class Person { //姓名 private String name; //年龄 private int age; / ...
- LeetCode Number of Longest Increasing Subsequence
原题链接在这里:https://leetcode.com/problems/number-of-longest-increasing-subsequence/description/ 题目: Give ...
- 洛谷【P1004】方格取数
浅谈\(DP\):https://www.cnblogs.com/AKMer/p/10437525.html 题目传送门:https://www.luogu.org/problemnew/show/P ...