其实最好地去理解背包问题的话,还是手跑一下这个过程,会加深理解。 代码写法↓ for(int i=1;i<=n;i++)//枚举 物品 for(int j=1;j<=V;j--)//枚举体积 //这个位置是可以正序枚举的. qwq //一维01背包必须倒叙 emmm //这个没错a emmm //采药可以过的 qwq if(j>=c[i]) f[i][j]=max(f...
这个log也是可以避免的。 这里用到单调队列优化。 我们发现对于给定的一个物品i,其体积大小w是确定的,所以对于每一个枚举的容量j,一定是从dp[j−k×w]dp[j−k×w]转移过来,其中k的范围为0<=k<=m[i]0<=k<=m[i]。 于是我们发现,可以把 j 按照 j%w 的值进行分类,即在转移时一定是余数相同的j...
单调队列优化多重背包 洛谷P1776 宝物筛选 题目链接:https://www.luogu.org/problem/P1776 首先我们知道单调队列,就是在区间移动时动态维护区间的最值 单调队列优化的主要思想就是分组更新,因为w[i] w[i]w[i]是成倍增加的 对于当前为w的体积,我们可以按它的余数分w组,即0,1...w-1 同一个余数的在一组...
考虑用单调队列优化。 我们若要用单调队列优化,那么必须满足转移时所需要的状态只与\(k\)有关 这里要用到一个神仙操作,对\(j \% w[i]\)分类 因为对于\(\% j\)后相同的数,转移时只有\(k\)的值不相同。 设\(a = \frac{j}{w[i]}, b = j \% w[i]\) 那么转移方程可以写成 \(f[i][j]...
这一步没有搞懂啊,说好的最后应该加上 a*c[i] 的呢 洛谷P1776 宝物筛选 #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<queue>#include<stack>#include<cmath>usingnamespacestd; typedeflonglongll;constintmaxn =100010;intn,m,ans;inthead,tail;intc[maxn],w[maxn],...