文章目录

  • 先上菜
  • 观察
  • 思路
  • 甜点

先上菜

经典例题
题目的意思是,这里有n个汉堡,每个汉堡都有价值value和花费cost,另外,每个汉堡的制作有一些依赖关系,必须要先制作某些汉堡之后才能制作这个汉堡,求最大价值。

观察

观察数据范围我们发现,n<= 15,215=32,768,注意到这里我们每个汉堡最多制作一个,我们利用0和1表示我们制作汉堡的情况。

思路

我觉得,状态压缩dp,与其说dp更是有种暴力的味道。首先我们初始化状态数组为-1。状态压缩dp我们要考虑最开始的状态。我们不做汉堡,000000000的状态下,f[0] = 0。就像一棵树一样,这是所以状态的根,就像网络流里的超级源点,一切的一切都从这个零开始。我们每次做汉堡都会使得1 增多,向更大的状态转移,例如000->100, 010, 001,不断地向后生长,开枝散叶。如果说遍历到当前的状态是-1则说明不存在合法的状态转移到该状态。跳过。那么如何判断当前的状态能转移到哪些状态呢,我们考虑遍历所有可能的汉堡,如果说当前的1111的子集中含有制作该汉堡的1的子集,并且,花费足够,就可以向后转移。最后我们遍历所有的状态,求出最大值。

甜点

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 20, S = 1 << 16;
int cost[N], val[N], pre[S], f[S];
void solve() {int n, tol;cin >> n >> tol;for (int i = 1; i <= n; i++) cin >> val[i];for (int i = 1; i <= n; i++) cin >> cost[i];for (int i = 1; i <= n; i++) {int q;cin >> q;pre[i] = 0;for (int j = 0; j < q; j++) {int x;cin >> x;pre[i] |= 1 << x - 1;//记录状态,所需的前置条件}}memset(f, -1, sizeof(f));f[0] = 0;int ans = 0;for (int i = 0; i < (1 << n); i++) {if (f[i] == -1) continue;//该状态不存在前驱,非法for (int j = 1; j <= n; j++) {if ((i & pre[j]) != pre[j]) continue;//含有所有的前置条件,子集便可if (i & (1 << j - 1)) continue;//已经制作就不能制作了int sum = 0;//计算费用for (int k = 1; k <= n; k++) {if (i & (1 << k - 1)) sum += cost[k];}if (cost[j] + sum > tol) continue;f[i | (1 << j - 1)] = max(f[i | (1 << j - 1)], f[i] + val[j]);}//向着更多的汉堡转移} for (int i = 0; i < (1 << n); i++) ans = max(ans, f[i]);//清点答案cout << ans << '\n';
}
int main() {ios::sync_with_stdio(false);cin.tie(0);int T = 1;cin >> T;while (T--) {solve();}return 0;
}

状态压缩DP一瞥【初识】相关推荐

  1. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

  2. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  3. BZOJ1688|二进制枚举子集| 状态压缩DP

    Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...

  4. hdu1074 状态压缩dp+记录方案

    题意:       给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路:       状态压缩dp,记录方案数的地方 ...

  5. FZU-2218 Simple String Problem(状态压缩DP)

    原题地址: 题意: 给你一个串和两个整数n和k,n表示串的长度,k表示串只有前k个小写字母,问你两个不含相同元素的连续子串的长度的最大乘积. 思路: 状态压缩DP最多16位,第i位的状态表示第i位字母 ...

  6. 《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp

    文章目录 题目解答 题目链接 题目解答 分析: 状态压缩dp是用二进制数来表示状态. 数据范围n = 20, 那么状态总量就是2202^{20}220个状态. 可以按照以下思路去思考: 哪些点被用过 ...

  7. 状态压缩DP AcWing算法提高课 (详解)

    基础课的状态压缩点这里 基础课中 蒙德里安的梦想 属于 棋盘式状态压缩dp,最短Hamilton路径 属于 集合状态压缩dp 1064. 小国王(棋盘式/基于连通性) 这种棋盘放置类问题,在没有事先知 ...

  8. hdu 5067(状态压缩dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...

  9. hdu 5418(状态压缩dp+Floyd)

    点击打开链接 解题思路:这道题目和TSP问题很相似,唯一不同的是同一个点可以重复走几次.... 这道题目只有16个顶点,所以很容易想到状态压缩dp,dp[i][j]表示到达顶点i时的状态为j的最小花费 ...

最新文章

  1. boost::foreach模块非常量右值的测试程序
  2. 算法学习之路|打印排名
  3. python制作计算机程序_用 Python 开发实用程序 – 计算器
  4. 真格量化——GFTD策略
  5. java等待5秒_Java并发编程-主线程等待子线程解决方案
  6. linux 单步启动_Linux内核如何装载和启动一个可执行程序
  7. Phpstorm-php在线手册配置
  8. 设置MyEclipse编码、补全快捷键、字体大小
  9. Win8快捷键的使用
  10. k3cloud6.0文件服务器,K3Cloud系统集成配置详解
  11. 通过 百度网盘 分享文件
  12. 产品快速迭代的五大要点
  13. python如何提取奇数_Python 获取奇数和偶数
  14. HashMap源码解析JDK1.8 —————— 开开开山怪
  15. JavaEE_Swagger
  16. Staking来袭,10亿级市场打开! | 火星总编时刻NO.31
  17. 台式计算机开机没反应,台式机开机没反应怎么回事
  18. Servlet 原理
  19. 计算机开机启动过程详解
  20. (完整项目源码)GPS定位源码整套管理系统,轨迹播放,车辆管理,电子围栏,报警记录,数据库/人员定位/宠物定位/物流跟踪/资产定位

热门文章

  1. 我看微软收购GitHub
  2. 盘古开源解读:我国大数据产业发展呈现出五大特点
  3. git config命令详解
  4. 学习struts2(1)
  5. 亿都游戏有限公司开始招人啦
  6. vue中怎么点击修改文字_vue中如何实时修改输入的值
  7. vue核心面试题:Vue中相同逻辑如何抽离?
  8. 【LaTeX】LaTeX入门
  9. android Studio 编写美图秀秀的简单demo
  10. word2013中如何设置目录和正文页码不同以及奇偶页不同但页码连续