题目链接:传送门
1. 题意:你要让n个朋友做完m道题,每个人能做掉特定某些题目,有一个花费x和需要的monitor(班长)个数,每个monitor(监视器)需要一定花费,但是monitor(显示屏)可以给所有朋友公用。求做完所有题的最小花费。(e.i. m很小)
2. 思路:m很小,所以压缩m的所有状态。f[state]表示做了state状态所花费的最小费用(不买monitor)。然而monitor还是需要管的,所以把所有朋友按monitor数量升序排序,这样每次用一个朋友更新状态时他自己必然是需要monitor最多的,那就拿他自己的monitor数量更新就好了。
3. 实现:排序+状压DP
4. 曾经的错误思路:monitor数量降序排列,然后f[state]表示加上monitor之后的最小价值,g[state]表示对应的f[state]状态去掉monitor花费后的价格。因为降序,所以所有f[nxt]都是由已经拥有比他大的monitor数量的状态转移过来,所以只要再加上买朋友的花费就好了。然而这样的思路不能保证记录的f[]最优,因为有monitor的影响,如果有monitor较少但f值较大的,他不会被更新,这是错误的。
5. 最后贴代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int N = 101;
const int E = (1<<20);
int n, m, b, maxst;
struct NODE{int x, k, st;
}a[N];
int f[E], ans;bool cmp(NODE x, NODE y){return x.k < y.k;}main()
{scanf("%lld%lld%lld", &n, &m, &b);maxst = 1<<m;for (int i = 1; i <= n; i++){int num, y;a[i].st = 0;scanf("%lld%lld%lld", &a[i].x, &a[i].k, &num);for (int j = 1; j <= num; j++){scanf("%lld", &y);a[i].st += 1<<(y-1);}}sort(a+1, a+n+1, cmp);memset(f, -1, sizeof(f));f[0] = 0;ans = -1;for (int i = 1; i <= n; i++)for (int now = 0; now < maxst; now++)if (f[now] != -1){int nxt = now|a[i].st;if (f[nxt] == -1 || f[nxt] > f[now]+a[i].x){f[nxt] = f[now]+a[i].x;if (nxt == maxst-1 && (ans == -1 || ans > f[nxt]+a[i].k*b))ans = f[nxt]+a[i].k*b;}}printf("%lld", ans);return 0;
}

Codeforces 417D Cunning Gena(状压DP)相关推荐

  1. CodeForces - 1550E Stringforces(二分+状压dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,只包含前 kkk 个小写字母以及通配符 ???,现在可以将通配符替换成任意的前 kkk 个字母中的一个.设 f[i]f[i]f[i] 为 ...

  2. Codeforces ----- Kefa and Dishes [状压dp]

    题目传送门:580D 题目大意:给你n道菜以及每道菜一个权值,k个条件,即第y道菜在第x道后马上吃有z的附加值,求从中取m道菜的最大权值 看到这道题,我们会想到去枚举,但是很显然这是会超时的,再一看数 ...

  3. CodeForces - 1523D Love-Hate(随机数+状压dp)

    题目链接:点击查看 题目大意:给出 nnn 个 010101 序列表示二进制状态,问选择至少 ⌈n2⌉\lceil \frac{n}{2}\rceil⌈2n​⌉ 个状态进行位运算的与运算后得到的答案中 ...

  4. Codeforces 1741G 最短路上状压dp

    题意: 有 n n n个地方,他们被 m m m条道路相连.有一天, t o t tot tot个人在 1 1 1处开派对,开完派对他们要回家,他们回家只会走最短路径,其中有 k ( k ≤ 6 ) ...

  5. CodeForces - 1316E Team Building(状压dp)

    题目链接:点击查看 题目大意:给出 n 个人,现在需要 p 个球员和 k 个啦啦队员,n 个人当啦啦队员以及当第 i 个位置的球员所做的贡献都会给出,现在问如何分配可以使得总贡献和最大 题目分析:因为 ...

  6. Codeforces Gym 100676G Training Camp 状压dp

    http://codeforces.com/gym/100676 题目大意是告诉你要修n门课,每门课有一个权值w[i], 在第k天修该课程讲获得k*w[i]的学习点数,给出了课程与先修课程的关系,要修 ...

  7. Educational Codeforces Round 13 E. Another Sith Tournament 状压dp

    E. Another Sith Tournament 题目连接: http://www.codeforces.com/contest/678/problem/E Description The rul ...

  8. Codeforces Beta Round #8 C. Looking for Order 状压dp

    题目链接: http://codeforces.com/problemset/problem/8/C C. Looking for Order time limit per test:4 second ...

  9. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  10. Gym - 101853E E. Maximum Sum (状压DP)

    原题地址:https://codeforces.com/gym/101853/problem/E 题意:给出一个n*n的矩阵,矩阵中每一个格子都有一个权值,选择一个格子就能拿到当前的权值,但是同时就不 ...

最新文章

  1. 单链表逆序生成及逆置的完整实现
  2. 如何使用好android的可访问性服务(Accessibility Services)
  3. 【教程】TestComplete测试桌面应用程序教程(四)
  4. python编程做什么工作-学python编程语言能找什么工作
  5. 机器人编程与python语言的区别_儿童编程和机器人编程有啥区别?
  6. 3级软件测试试题,软件测试人员(.NET)_3级_操作技能鉴定1.1.3试题单(26页)-原创力文档...
  7. java list 在头部添加6_【Java提高十六】集合List接口详解
  8. Python 告诉你:8.3 分口碑炸裂!潘粤明版《鬼吹灯》到底好看在哪儿?
  9. linux查看java堆栈信息_Java运行状态分析2:获取线程堆栈信息
  10. 奇门对接需求设计_奇门格局详解_-_么学声_张志春
  11. 3ds max 2020 vray 5.0 渲染设置
  12. 给文件夹加密的两种方法
  13. 在小县城做什么生意好?
  14. qt,QGraphicsView实现鼠标中键拖动图片,鼠标滚轮缩放、两个窗口联动左键选点等功能(c++pyqt两个版本)
  15. CANOE入门:CAPL语言(1)
  16. mysql 把换行符全部删掉_mysql怎么去除字段中换行符与回车符
  17. 如何建立高质量团队-《克服团队协作的五种障碍》笔记与心得
  18. centos8 编译安装黑客矩阵特效软件cmatrix
  19. ps2021没法用神经元滤镜,ps2021版神经滤镜能用吗
  20. 【数据科学赛】大规模细粒度建筑分类 #图像分类 #建筑分割和高度预估 #$1,6000

热门文章

  1. 阶段二第一部分:第2章 Nginx进阶与实战
  2. springboot+MyBatis返回Map时值为null的字段会丢失
  3. 上海职业学校计算机证书查询,证书查询
  4. w ndows10图标,win10桌面图标变白怎么解决
  5. 用c语言求积分程序,菜鸟学C语言(五)之求定积分
  6. safari看html5卡顿,MacOS下Safari 10浏览器卡顿解决方案整理 - YangJunwei
  7. Excel VBA 入门基础
  8. Remix OS——一个很有魅力的Android系统
  9. 笑来就是个鸡汤写手啊!
  10. c#调用触滑输入法实现触摸屏键盘功能