题目链接 把重量表示为\(a\times2^b\)的形式,然后按\(b\)排序. 从高到低枚举每一位,\(f[i]\)表示当前位容量为\(i\)时的最大价值(容量即\(a\times2^{bit}\)).对于同一位,直接\(01\)背包就行了. 如何转移到下一位?\(f[i]\)转移到\(f[i\times2+\text{W在这一位是否为1}]\).注意到每一位的容量不会超过\(n\times a_{max}=1000\),所以再对\(1000\)取\(\min\)即可. //840kb 64m…
[BZOJ1190][HNOI2007]梦幻岛宝珠 Description 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值.数据范围:N<=100;W<=2^30,并且保证每颗宝石的重量符合a*2^b(a<=10;b<=30) Input 输入文件中包含多组数据.每组数据的格式如下:第一行是两个正整数n和W,1≤n≤100,1≤W≤2^30,分别表示宝石的数目和最多能带走的宝石重量.接下来的n行,每行有两个…
1190: [HNOI2007]梦幻岛宝珠 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1385  Solved: 798[Submit][Status][Discuss] Description 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为 ,并输出最大的总价值. 数据范围:N<=100;W<=2^30,并且保证每颗宝石的重量符合a*2^b(a<=10;b<=30) In…
1190: [HNOI2007]梦幻岛宝珠 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1057  Solved: 611[Submit][Status][Discuss] Description 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值.数据范围:N<=100;W<=2^30,并且保证每颗宝石的重量符合a*2^b(a<=10;b<=30) Inpu…
他都告诉你能拆了 那就拆呗.把每个重量拆成$a*2^b$的形式 然后对于每个不同的b,先分开做30个背包 再设f[i][j]表示b<=i的物品中 容量为$ j*2^i+W\&((1<<(i-1))-1) $(就是这一位是j+W的前i-1位)的最大权值(这个容量没必要填满) 然后f[i][j]就可以从f[i-1][j*2+W的第i-1位]转移过来,再拿着这个去更新本层的其他容量 最后答案就是f[x][1],x是W的最高位1的位数 #include<bits/stdc++.h&…
Description 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值. 数据范围:N<=100;W<=2^30,并且保证每颗宝石的重量符合a*2^b(a<=10;b<=30)Input 输入文件中包含多组数据.每组数据的格式如下:第一行是两个正整数n和W,1≤n≤100,1≤W≤2^30,分别表示宝石的数目和最多能带走的宝石重量.接下来的n行,每行有两个正整数weighti和valuei,1≤weight…
这题是在01背包问题的基础上,扩充了重量,需要用时间换空间. 思路: 1.仔细看题,注意到重量wi为a*2^b(a<=10,b<=30),很容易想到要按 b 分开做背包的DP.接下来的重点就是怎么使DP从b-1继承到b. 2.再仔细看题,发现只有一次询问,那么就可以在这个W上做文章--依W的大小进行所有的DP.由于是按b的大小进行DP,所以把数都看成二进制位来继承和转移,每对一组 b 相同的数做完后,就略去这一二进制位. 实现: 1."去位":若W的二进制数上第 i 位为1…
LINK:梦幻岛宝珠 时隔多日 我再次挑战这道题.还是以失败告终. 我觉得这一道背包真的有点难度 这是一个数量较少 但是价值和体积较大的背包. 通常的01背包 要不就是体积小 要么是价值小 但这道题给了价值和体积都大 说明必然有其他重要的条件. 那就是体积为\(a*2^b\) \(a\leq 10,b\leq 30\) 只有这一个有利用价值的东西 我们无奈的对这个东西进行dp 对b进行分组 然后各个组进行dp. 关键我们如何把这些组给合起来.我想了很久 也翻了好几篇题解. 我终于明白为什么了.这…
显然直接 \(01\) 背包会超时并且超空间 套路:分层 \(DP\) 「考虑将每个子结构看作一层(也就是包含了不止 \(1\) 个物品的信息),并且大层不会对小层造成影响,可以考虑先进行每一层的自我更新(即用当前层物品更新当前层答案),再进行层的合并,此时考虑低层对高层的影响」 正题 那么这题有一个特殊性质: \(V_i = a \times 2^b\) b值大的物品不会影响零碎剩余的重量上限. 将物品按b值分阶段处理. 那么就是分层 \(DP\) 先通过普通的 \(01\) 背包更新当前层自…
题目 https://lydsy.com/JudgeOnline/problem.php?id=1190 题解 好神仙的一道题啊. 既然 \(w_i = a_i\cdot 2^{b_i}\),那么不妨按照 \(b_i\) 来分组,每一组内部先做一个 01 背包,记为 \(f[i][j]\). 然后考虑怎么求出最后的总答案. 下面就是很妙的部分了: \(dp[i][j]\) 表示前 \(i\) 位中,容量 \(\leq j\cdot 2^i+(W\&(2^i-1))\) 的最大价值. 转移的时候我…
给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值.数据范围:N<=100;W<=2^30,并且保证每颗宝石的重量符合a*2^b(a<=10;b<=30) Solution 神仙背包. 我们可以先对每个二进制位dp一下,然后从低到高位依次处理. 合并操作比较麻烦. 假设我们有一个容量为j的背包,我们要从上一层拿容量为k的物品,那么我们上一层需要的大小为k*2+(w>>i-1)&1,后面的是要…
BZOJ 洛谷 \(shadowice\)已经把他的思路说的很清楚了,可以先看一下会更好理解? 这篇主要是对\(Claris\)题解的简单说明.与\(shadowice\)的做法还是有差异的(比如并没有明显用到后序遍历的性质),而且用这种写法可能跑的比较轻松? (另外你只要想明白\(f,h\)是代表啥,就很好理解了...) 问题等价于树形依赖背包,允许一条链每个点各免费取一次. 免费取一条链即\(t\leq h+k\)的限制.这样最优解一定会免费取了一条从叶子到根节点的链. 现在考虑一下怎么做.…
bzoj1190,懒得复制,戳我戳我 Solution: 这道题其实是一个背包(分组背包),但是由于数字比较大,就要重新构造dp式子.啃了三天才懂. \(dp[i][j]\)表示背包容积为\(j*2^i\)时的最大价值. 首先,因为每一个物品一定是\(a*2^b\),我们可以按照\(b\)值先按照普通的分组背包去做,处理出每个\(b\)值所对应的\(dp\)值 然后我们就是要把这些\(dp\)值累积起来,选择每组最大显然不合适,因为有可能每个组都剩下空间,剩余空间累加起来的空间还可以放物品,我们…
题目描述 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值.  数据范围:N<=100;W<=2^30,并且保证每颗宝石的重量符合a*2^b(a<=10;b<=30) 输入格式 输入文件中包含多组数据.  每组数据的格式如下:  第一行是两个正整数n和W,1≤n≤100,1≤W≤2^30,分别表示宝石的数目和最多能带走的宝石重量.  接下来的n行,每行有两个正整数weighti和valuei,1≤weight…
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1042 题意:给出四种面值的硬币c1,c2,c3,c4.n个询问.每次询问用d1.d2.d3.d4个相应的硬币能够拼出多少种总和为s? 思路:(1)首先,用完全背包求出f[i]表示四种硬币的数量无限制拼出i的方案数. (2)接着我们来理解 x=f[s]-f[s-(d1+1)*c1]的含义:x表示c1硬币的数量不超过d1个而其他三种硬币的数量不限制拼成s的方案数.我们举着例子来说明, 假设…
传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1190 [题解] 首先,我们把所有物品都分解成$a\times 2^b$的形式,然后把物品按照$b$分组: 我们按$b$从高到低考虑.$f(i,j)$表示考虑到$2^i$,当前还剩余$j\times 2^i$的空间,所能取到的最大值. 每层先从上一层传递$f$数组,然后再更新.每次就是一个背包转移了. 考虑这个$j$可能随着$b$减小越来越大,我们需要优化. 对于每一层的物品,最多只能表示…
Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一扇门,人们可以从这儿撤出房间.已知门 一定在房间的边界上,并且边界上不会有空地.最初,每块空地上都有一个人,在疏散的时候,每一秒钟每个人都 可以向上下左右四个方向移动一格,当然他也可以站着不动.疏散开始后,每块空地上就没有人数限制了(也就是 说每块空地可以同时站无数个人).但是,由于门很窄,每一秒…
传送门 注意到 $a,b$ 不大 考虑对每一个 $a*2^b$ 的 $b$ 分别背包 设 $f[i][j]$ 表示只考虑 $b=i$ 的物品时,容量为 $j= \sum a$ 的最大价值 这个就是普通的 $01$ 背包 考虑把 $f[i][j]$ 之间合并起来,为了得到容量为 $W$ 时的答案,我们要把 $f$ 的含义稍微变化一下 变成 $f[i][j]$ 表示当前考虑了 $b=2^1$ 到 $b=2^i$ 时的物品,容量为 $j*2^i$ 加上 $W$ 二进制下前 $i-1$ 位的值,此时的最…
题解: 一道比较好的题目 首先比较显然的就是我们要按照a*2^b的b的顺序来枚举 那么状态f[i][j]表示当前在b,用了a*2^b 刚开始没想到怎么不同层之间搞 看了题解发现非常简单 由于每一层到最后一层有用的二进制位至少时从自己的二进制位开始 所以我们可以舍弃那些没用的二进制位 maxa(f[i][j],f[i][k]+f[i-1][(j-k)*2]) 常数优化就是那个(j-k)*2可以再min个1000 另外f[i][j]其实是个前缀和优化,所以刚开始都为0就可以了 不太想写对拍然后统计的…
要判边界!!要判边界!!要判边界!!if(j!=m)!!! 我真是zz横着转移要判断到底能不能向右边出边-- 然后剩下的和1814差不多,九十因为不要求经过所有格子,所以左右括号随时可以合并,但是注意合并的时候轮廓线上不能有别的括号,然后还有是(0,0)可以转移到(0,0),相当一不经过这个格子 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=3…
给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值.数据范围:N<=100;W<=2^30,并且保证每颗宝石的重量符合a*2^b(a<=10;b<=30) Input 输入文件中包含多组数据.每组数据的格式如下:第一行是两个正整数n和W,1≤n≤100,1≤W≤2^30,分别表示宝石的数目和最多能带走的宝石重量.接下来的n行,每行有两个正整数weighti和valuei,1≤weighti≤2^30, 0≤va…
E - 梦幻岛宝珠 HYSBZ - 1190 这个题目我觉得很难,看题解都看了很久. 首先可以得到一个大概的思路就是分组,每一个数都可以分成 a*2^b  所以把b相同的数都分成一个组. 在每一组内部进行01背包,这个操作比较简单. 比较难的是组与组之间进行转移. 定义 dp[i][j] 表示在第i层容量为 j*2^i 的最大价值. 那么怎么从第 i-1 层转移到第 i 层呢? 因为到dp[i][j] 到第 i 层的容量为 第 i 层本身的容量+之前总容量 所以就是 j*2^i+w&((1<…
题意保证了是一个置换群. 根据burnside引理, 答案为Σc(f) / (M+1). c(f)表示置换f的不动点数, 而题目限制了颜色的数量, 所以还得满足题目, 用背包dp来计算.dp(x,i,j,k) = dp(x,i-cntx,j,k)+dp(x,i,j-cntx,k)+dp(x,i,j,k-cntx)表示前x个置换红蓝绿个用了i,j,k次,cntx表示第x个置换的循环数. 然后最后乘(M+1)的乘法逆元就OK了. -----------------------------------…
我自己只能想出O( n*3^m )的做法....肯定会T O( nm*2^m )做法: dp( x, s ) 表示考虑了前 x 个商店, 已买的东西的集合为s. 考虑转移 : 先假设我们到第x个商店去, so初始时 dp( x, s) = dp( x-1, s ) + d[x] 然后我们可以对第x个商店做01背包, dp(x, s + {h} ) = min( dp( x, s + {h} ) , dp( x, s) + c[x][h]) ) ( h ∉ s ). 之后我们再比较到第x个商店划不…
题目传送门 观察数据a*2^b,转化成二进制后,后面跟了b位的0,可以转化为一个分层背包. 先预处理出每个物品是哪一层的,并放在同层内DP. 同层内直接背包,考虑层与层之间的DP. 第一维枚举层数,然后做类似于背包的DP,细节看code. code: /************************************************************** Problem: 1190 User: yekehe Language: C++ Result: Accepted Ti…
0/1背包 给出n个物品,每个物品有Vi的价值和Wi的费用,我们总共有m块钱,求最多能得到多少价值的物品. N<=10^3,m<=10^3 记录方案数?记录输出方案? 输出方案: 对每个dp[i][j]记录是由哪个状态转移过来的,然后从最后一直往前找,输出: 最优策略方案数:再定义一个数组f[i][j]=dp[i-1][j]>dp[i-1][j-w[i]]+v[i]?f[i-1][j]:f[i-1][j-w[i]]; if(dp[i-1][j]==dp[i-1][j-w[i]]+v[i]…
BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划 又是一道卡精度卡得我头皮发麻的题-- 题面(--蜜汁改编版) YL大哥是24OI的大哥,有一天,他想要从\(N\)个候选人中选\(K\)个小弟(\(N, K \le 2500\)). 想要成为大哥的小弟不是件容易事,必须要有一个举荐人才行,所以每个候选人\(i\)都有一个另一个候选人\(R_i\)作为举荐人,只有当举荐人\(R_i\)被大哥选为小弟时,候选人\(i\)才有可能被选. 每个候选人都有一个选取代价\(S_i\)…
01背包 动态规划是一种高效的算法.在数学和计算机科学中,是一种将复杂问题的分成多个简单的小问题思想 ---- 分而治之.因此我们使用动态规划的时候,原问题必须是重叠的子问题.运用动态规划设计的算法比一般朴素算法高效很多,因为动态规划不会重复计算已经计算过的子问题.因为动态规划又可以称为“记忆化搜索”. 01背包是介绍动态规划最经典的例子,同时也是最简单的一个.我们先看看01背包的是什么? 问题(01背包): 有n个重量和价值分别为vi和ci的物品.从这些物品中挑出总重量不超过m的物品,求所有挑…
Partial Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5534 Description In mathematics, and more specifically in graph theory, a tree is an undirected graph in which any two nodes are connected by exactly…
The Highest Mark Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5501 Description 2045年的SD省队选拔,赛制和三十年前已是完全不同.一场比赛的比赛时间有 ttt 分钟,有 nnn 道题目. 第 iii 道题目的初始分值为 Ai(Ai≤106)A_i(A_i \leq 10^{6})A​i​​(A​i​​≤10​6​​) 分,之后每过一分…