#include using namespace std; const int maxn=1000+10; int n,k,w[maxn],v[maxn],dp[11*maxn]={0},nw[11*maxn],nv[11*maxn],cnt=0,c[maxn]; //01背包二进制拆分 //普通拆... ...
分类:
其他好文 时间:
2020-06-06 22:01:03
阅读次数:
85
"SCOI 2016 萌萌哒" solution 有点线段树的味道,但是并不是用线段树来做,而是用到另外一个区间修改和查询的利器——ST表 我们可以将一个点拆成$logN$个点,分别代表从点$i$开始,长度为$2^k$的子串 那么当我们处理两个区间相等的关系时,对区间做二进制拆分,拆成$log$个区 ...
分类:
其他好文 时间:
2020-05-04 19:04:50
阅读次数:
50
题目 有n种物品和一个容积为V的背包,第i种物品有amount[i]个,体积cost[i]和价值valum[i],问如何选取物品使得放入背包的物品价值之和最大。 优化 amount[i]==1时,当01背包处理。 amount[i]≥1时,采用二进制拆分,从而转换成01背包求解,具体如下: 在上面的 ...
分类:
其他好文 时间:
2020-04-27 19:17:06
阅读次数:
49
有N种物品和一个容量为V的背包。第i种物品最多有p[i]件可用,每件费用是w[i],价值是v[i]v[i]v[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 具体转换为01背包的策略: 二进制拆分 将第i种物品分成若干件物品,其中 例如意见物品的p【i】为13,则 ...
分类:
其他好文 时间:
2020-04-27 19:16:11
阅读次数:
53
传送门 大意: 有价值分别为1..6的大理石各a[1..6]块,现要将它们分成两部分,使得两部分价值之和相等,问是否可以实现。其中大理石的总数不超过20000。 解题思路: 妥妥的多重背包+二进制拆分,主要写一下二进制拆分存个档(儿时的噩梦)。 总所周知,20,21,22,……2k-1从中挑选若干个 ...
分类:
其他好文 时间:
2020-04-09 00:16:52
阅读次数:
90
蛤的旅行 [题目描述] 长江的江心有n块石头。为了简化问题,我们把长江看做一条数轴,且所有石头的坐标均为正整数。 有一只蛤在这些石头上跳。这只蛤在长江中生活了数百年,多年与风浪搏斗的经验使他锻炼出了极强的跳跃能力,可以瞬间从一块石头跳到与其相距任意远的另一块石头上。 然而,在一次意外进入一片诡异的灌 ...
分类:
其他好文 时间:
2020-02-21 22:01:39
阅读次数:
86
/* 先把n二进制拆分,用map保存a[i]出现次数 然后从低位到高位去凑n 对于n某位是1的位数i 考虑mp里是否有1<<i 如果没有,考虑mp里比i低位的数能否凑出i, 如果还是没有,就从高位去拆,只有这种情况下,才会对答案有贡献 */ #include<bits/stdc++.h> using ...
分类:
其他好文 时间:
2020-02-13 09:46:36
阅读次数:
55
"Link" 直接连边是$O(n^2)$的显然不可取。 考虑二进制拆分,对于点$u$,我们可以只连$u\rightarrow u\oplus 2^k$的边,显然在这样建出来的图上跑最短路和在原图上跑最短路是等价的。 不过因为中间可能会经过$ n$的点,所以要把点补齐至$[0,2^k)$。 ...
分类:
其他好文 时间:
2020-01-25 16:51:50
阅读次数:
87
"Link" 一个很trivial的想法是并查集暴力维护,最后的答案是$9 10^n$,$n$是最后剩下的并查集的个数。 因为每次连边的都是一段区间到另一端区间,所以我们可以二进制拆分,把并查集的每个点拆成$\log$个点,每次把要连边的区间拆成$\log$个点直接连,最后再还原。 ...
分类:
其他好文 时间:
2020-01-18 01:07:26
阅读次数:
64
http://acm.hdu.edu.cn/showproblem.php?pid=2844 题意:给你n种硬币和商品价格m,每种硬币给出价值和数量。问1-m价值中有多少种价值可以用这些硬币表示出来。 解法:因题目数据量较大,必须二进制拆分成01背包优化。 最后遍历所以容量,如果价值等于容量则表示该 ...
分类:
其他好文 时间:
2019-12-04 01:28:57
阅读次数:
65