
背包DP
二分抄代码
去了18ec没资格去19ec的反向训练选手
展开
-
codeforces1132E Knapsack
https://codeforces.com/contest/1132/problem/E本来以为是道大容量背包的,结果是个技巧题。。。840是1-8的lcm,对于一个840,我们用1-8任意一个数全部填充满是相等的所以我们先测cnt[1-8]能有多少个840,为了最后搞01背包计算冗余量,我们直接给cnt[1-8]留至少1个840,不超过2个然后用剩下的数字去做01背包,复杂度就是840*8*840*8*2,这个数并不是很大然后如果tmp>w,那么说明把tmp直接减少到w/840原创 2020-12-16 23:40:23 · 183 阅读 · 0 评论 -
2020小米邀请赛网络选拔赛第二场H Knapsack 决策单调性优化大容量多重背包 分治
https://ac.nowcoder.com/acm/contest/7502/H学习自https://blog.youkuaiyun.com/qq_30361651/article/details/109477637无论是分治还是单调队列搞二分都是O(w m logm)的,叉姐题解说的SMAWK算法中文网上都查不到相关的题解或者算法笔记,维基百科上倒是有。。。还是不学了,这个时限也是放log过的#include<bits/stdc++.h>using namespace std;t原创 2020-12-15 19:21:14 · 407 阅读 · 0 评论 -
gym101064L The Knapsack problem 超大容量完全背包
https://codeforces.com/gym/101064/problem/L由于是完全背包,所以我们可以合并背包容量设F(S)为S容量的最大值,我们可以把他分成两部分F(S)=F(A)+F(B),|A-B|<=maxw,因为如果>=maxw你总可以把大的部分的某个物品移动到小的那边,因为是完全背包,物品重复用,所以我们不考虑A,B中实际的物品情况那么我们就相当于对S进行二进制拆解了,要求出F(S),就求出F(S/2-maxw)-F(S/2+maxw)的值,然后把他们合并的时原创 2020-12-15 00:45:56 · 493 阅读 · 0 评论 -
slim cut 2016ACM/ICPC 香港现场赛H
https://vjudge.net/contest/392376#problem/H学习自https://blog.youkuaiyun.com/u014609452/article/details/68482711?locationNum=10&fps=1对时间分治原来可以不用在线段树上搞,直接动态开vector和数组保证只有Logn*m的空间就行了#include<bits/stdc++.h>using namespace std;const int maxn=1401原创 2020-09-04 12:53:51 · 316 阅读 · 0 评论 -
hdu6883 Coin Game 2020杭电多校第十场
http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1007&cid=888由于一个机器可以选择a,a+b和2*a+b,那么其实一个机器可以拆成两个物品,a和a+b,他们任选一个或者两个都选,都是可以的,所以就不需要判断机器冲突了。接下来就可以直接递推了,dp[i]->dp[i+1]的时候,是直接拿一个还没选的a,还是丢掉一个以前选的最小的a,拿一个当前剩下最大的a+b。#include<bits/stdc+原创 2020-08-20 17:06:00 · 397 阅读 · 0 评论 -
2019上海网络赛 J stone game
https://nanti.jisuanke.com/t/41420遇见一道有趣的背包题我们从大到小枚举,为了避免重复,我们需要将当前枚举到的a[i]设为必选,大于a[i]的为可选可不选,小于a[i]的不能选,然后看这时的方案数是多少。由于要满足1号2号条件,我们已经知道了我当前的石头最小重量为a[i],那么可以计算出 s' 集合的重量下界和上界,那么我们用01背包的方式统计方案数,当枚举...原创 2019-09-16 08:28:59 · 461 阅读 · 0 评论 -
hdu6804 1003 Contest of Rope Pulling 2020杭电多校
http://acm.hdu.edu.cn/showproblem.php?pid=6804题解的方法是取T=sqrt(n+m) * 1000 * 2的容量,然后随机打乱两个集合的物品顺序,然后去更新这个有限制大小的背包,直接在[-T,T]直接更新,期望总能在这一部分碰撞找到最优解。然而这题过了一车人,154个估计得有140个1e10暴力跑过去的,我加了一大把优化还跑步过去,反而最简单的能跑过,反向优化#include<bits/stdc++.h>using namespace原创 2020-07-31 11:19:34 · 431 阅读 · 0 评论 -
codeforces1381B Unmerge
https://codeforces.com/problemset/problem/1381/B这题只会n^3,掉大分。hwh:这不是显然的结论吗,人尽皆知啊我们判断是否可以组成满背包优先拿更短的物品去更新,如果更短的物品跟更长物品,可以只考虑这个更短的物品,也就是说,分组背包中一个组内,只考虑最短的物品就更新背包容量dp数组会更容易得到更多的位置能被组成。要知道这题的结论就是下一段数的首数字要大于上一段数字的全部,而且序列分段是连续不重叠的,于是如果能够1-2,1-3,1-4,那么必然可以原创 2020-07-22 22:29:40 · 305 阅读 · 0 评论 -
gym101002 Programming Team
https://codeforces.com/gym/10100201分数规划,然后树形背包即可时隔多年终于把zyj在15年暑假考场上想出来的算法弄懂了。。。。O(NK)的树形背包按dfs序从后往前dp,如果一个点选择要,那么dp[i][j]就可以从dp[i+1][j-w[i]]转移,而dp[i+1]代表从i+1到n的最优值。如果一个点不选择他,那么说明他的子树全部不能选,就从dp[i+son[i]][j]转移,因为i+son[i]就是去掉i这棵子树后,后面剩下的最优值,最后到dp[1],就原创 2020-05-26 01:44:28 · 216 阅读 · 0 评论 -
bzoj2287 洛谷P4141【POJ Challenge】消失之物
https://www.luogu.com.cn/problem/P4141这题的难点就是反过来想,得到答案很多时候DP都是反过来想就好求了,然而我在写下面这题的时候也反过来想,本以为简单,实则又复杂又假。。。https://blog.youkuaiyun.com/liufengwei1/article/details/105920677然后这题的f[i][j]表示前i个物品装满j的方案数,0...原创 2020-05-06 00:50:00 · 407 阅读 · 0 评论