[洛谷P4141] 消失之物「背包DP」】的更多相关文章

暴力:暴力枚举少了哪个,下面套一个01背包 f[i][j]表示到了i物品,用了j容量的背包时的方案数,f[i][j]=f[i-1][j]+f[i-1][j-w[i]]O(n^3) 优化:不考虑消失的,先跑一个01背包, 定义g[i][j]表示i消失时,容量为j的方案数,g[i][j]=f[n][j]-不合法的 逆着过来就是g[i][j]-=g[i][j-w[i] #include<iostream> #include<cstring> #include<cstdio>…
题目地址:https://www.luogu.org/problemnew/show/P4141 分析:这题当然可以直接暴力枚举去掉哪一个物品,然后每次暴力跑一遍背包,时间复杂度为O(m*n^2),显然超时.由于算去掉哪一个物品比较复杂,我们可以考虑容斥,算出他的补集,也就是选这个物品的方案数,然后用全集减去他的补集得到答案.算全集的过程就是跑一遍01背包,时间复杂度O(n^2),然后枚举去掉的物品i,再枚举背包的容积就j,算选择这个物品凑出这个容积的方案数就相当于算凑出j-w[i]的方案数,然…
题目链接:https://www.luogu.com.cn/problem/P4141 题目大意: 有 \(n\) 件物品,求第 \(i\) 件物品不能选的时候(\(i\) 从 \(1\) 到 \(n\))0-1背包方案数. 解题思路: 传统方法 遍历每一遍不选的物品,然后对剩余的物品求01背包方案数. 时间复杂度为 \(O(n^2m)\) . 由于这里每一件物品的价值和时间相同, 所以可以定义状态 \(f[i]\) 表示填满体积 \(i\) 的方案数. 则有状态转移方程: \(f[0] = 1…
题目:https://www.luogu.org/problemnew/show/P4141 竟然是容斥:不选 i 物品只需减去选了 i 物品的方案: 范围原来是2*10^3而不是2*103啊... 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; ],g[],v[],w[]; int main() { scanf("%d%d",&…
题目描述 ftiasch 有 N 个物品, 体积分别是 W1, W2, …, WN. 由于她的疏忽, 第 i 个物品丢失了. “要使用剩下的 N – 1 物品装满容积为 x 的背包,有几种方法呢?” — 这是经典的问题了.她把答案记为 Count(i, x) ,想要得到所有1 <= i <= N, 1 <= x <= M的 Count(i, x) 表格. 输入输出格式 输入格式: 第1行:两个整数 N (1 ≤ N ≤ 2 × 10^3)N(1≤N≤2×103) 和 M (1 ≤…
题目传送门 昨天晚上学长讲了这题,说是什么线段树分治,然后觉得不可做,但那还不是正解,然后感觉好像好难的样子. 由于什么鬼畜的分治不会好打,然后想了一下$O(nm)$的做法,想了好长时间觉得这题好像很像大力容斥.然后疯狂yy 正经题解: $O(n^2m)$的解法很好想,就是一个个枚举,但是显然时间吃不消,在观察题目,根据zzh学长的根据题目核心性质猜测法(雾 我们可以考虑容斥因为他题目的限制条件就是每次去掉一个物体,那么就可以先$O(nm)$处理出没有限制条件的总方案数,然后单步容斥,枚举每次去…
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1138  Solved: 654[Submit][Status][Discuss] Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. “要使用剩下的 N - 1 物品装满容积为 x 的背包,有几种方法呢?” -- 这是经典的问题了.她把答案记为 Count…
P1273 有线电视网 )逼着自己写DP 题意:在一棵树上选出最多的叶子节点,使得叶子节点的值 减去 各个叶子节点到根节点的消耗 >= 0: 思路: 树上分组背包DP,设dp[u][k] 表示 到以u节点为根节点选k个叶子能得到的最大值.则可得到状态转移方程, dp[u][k] = max(dp[u][k], dp[u][k-t] + dp[v][t] - cost),其中的t表示不同的可能,需要枚举. #include <algorithm> #include <iterator…
传送门 太珂怕了……为什么还有大佬用FFT和分治的…… 首先如果没有不取的限制的话就是一个裸的背包 然后我们考虑一下,正常的转移的话代码是下面这个样子的 ;i<=n;++i) for(int j=m;j>=a[i];--j) dp[j]+=dp[j-a[i]]; 然后我们如果不考虑某一个物品的话,只要把它的贡献给减掉就可以了 ;j<=m;++j) f[j]=dp[j]; for(int j=a[i];j<=m;++j) f[j]-=f[j-a[i]]; 然后这样叫上去只有80分………
题目大意:一共有 n 件食材,每件食材有三个属性,ai,bi和ci,如果在t时刻完成第i样食材则得到ai-t*bi的美味指数,用第i件食材做饭要花去ci的时间.众所周知,gw的厨艺不怎么样,所以他需要你设计烹调方案使得美味指数最大. 题解:这道题需要对背包问题有更加深入的理解. 可以发现,如果不进行排序操作的话,先选的物品会对后续选择的物品的价值产生影响,即:答案与选择的先后顺序有关.这与 0-1 背包问题不同,对于 0-1 背包问题来说,先选择的物品对后续物品答案的贡献没有影响,因此与选择的顺…