文章目录

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

先上菜

经典例题
题目的意思是,这里有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. 建议15: 使用dynamic来简化反射实现
  2. Websphere的类加载器以及策略的简单介绍
  3. 微软+开源,那些亲爱的以及热爱的
  4. php 字符符转整数
  5. 从HP收购ArcSight看SIEM/MSS市场现状与格局【9月17日更新】
  6. 关于 xib 的使用
  7. ...三个点es6用法
  8. 短视频解析技术原理,去水印原理分析整理汇总
  9. 页面开机自启动,页面置顶显示,页面持续获得焦点,鼠标点击器源码
  10. 找网络高手联系方式_怎么才能联系到网络高手(找网络大牛联系方式)
  11. 裁员潮,互联网寒冬的黑暗时刻
  12. Android shape属性大全
  13. 算法效率的度量--时间复杂度与空间复杂度
  14. 打开组策略 计算机配置,组策略命令,小编告诉你电脑组策略怎么打开
  15. AJAX IE7清除缓存
  16. matlab从无到有系列(六):高级图形处理功能(多窗口绘图以及花瓶绘制)
  17. xss.haozi挑战
  18. 一个网站的pv代表什么?
  19. 计算机设备选型的基本原则,设备选型的概念和选型依据
  20. 本周大新闻|谷歌眼镜企业版正式停售;Meta重组大裁员

热门文章

  1. 【数据分析案例】深度分析超市零售商店数据--Python数据分析实战
  2. 数据分析实战二:超市数据处理
  3. halcon缺陷检测
  4. Nginx 配置ssl证书 windows
  5. SCHNOKA施努卡:汽车总装车间智能装配
  6. WIFI6模块选型参考
  7. java设计模式之代理(转)
  8. 騰訊的“匿名”漂流瓶並不匿名zz
  9. 儿童玩具出口美国CPC证书包含信息
  10. @Retention元注解的使用