多重背包 /// 单调队列DP oj1943】的更多相关文章

题目大意: em.... 就是多重背包 挑战340页的东西 ...自己的笔记总结总是比较乱的 重点:原始的状态转移方程中 更新第 i 种物品时 重量%w[i] 的值不同 则它们之间是相互独立的: 1--- 就是说在考虑第 i 种物品拿几个时,w[i]+1 与 2*w[i]+1 与...与 k*w[i]+1 相互之间是有关联的 但 w[i]+j ... k*w[i]+j (j不为1) 与 w[i]+1 是相互独立 无关的,即%w[i]的值不同时 相互独立 2--- 那么可以将 w[i]+j 与 2…
[BZOJ4182]Shopping (点分治+树上多重背包+单调队列优化) 题面 马上就是小苗的生日了,为了给小苗准备礼物,小葱兴冲冲地来到了商店街.商店街有n个商店,并且它们之间的道路构成了一颗树的形状. 第i个商店只卖第i种物品,小苗对于这种物品的喜爱度是wi,物品的价格为ci,物品的库存是di.但是商店街有一项奇怪的规定:如果在商店u,v买了东西,并且有一个商店w在u到v的路径上,那么必须要在商店w买东西.小葱身上有m元钱,他想要尽量让小苗开心,所以他希望最大化小苗对买到物品的喜爱度之和…
BZOJ 题目的限制即:给定一棵树,只能任选一个连通块然后做背包,且每个点上的物品至少取一个.求花费为\(m\)时最大价值. 令\(f[i][j]\)表示在点\(i\),已用体积为\(j\)的最大价值. 如果物品数量为\(1\),那就是一个树形依赖背包(选儿子必须选父亲),用DFS序优化转移:\(f[i][j]=\max(f[i+1][j-v_i]+w_i,\ f[i+sz_i][j])\)(选该节点就可以从上一个点,即子树内转移,否则只能从另一棵子树转移),复杂度\(O(nm)\). 物品数量…
Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar.One day Tony opened his money-box and found there were some coins.He decided to buy a very nice watch in a nearby shop. He wanted to pay the exact pri…
大神博客转载http://www.cppblog.com/MatoNo1/archive/2011/07/05/150231.aspx多重背包的单调队列初中就知道了但一直没(不会)写二进制优化初中就写过一直不写会心虚就写一下这个吧朴素方程dp[i,j]=max(dp[i-1,j-w[i]*k]+c[i]*k) w[i]*k<=j k<=j div w[i]忽略第一维dp[j]=max(dp[j-w[i]*k]+c[i]*k)复杂度O(m2n)以下是大神原文:将决策下标按照模w0的余数进行分类,…
题意: 给出 n 种纸币的面值以及数量,求最少使用多少张纸币能凑成 M 的面额. 细节: 好像是要输出方案,看来很是头疼啊. 分析: 多重背包,裸体??? 咳咳,好吧需要低调,状态就出来了: dp [ i ] 表示面额为 i 最少需要多少张纸币组成. 转移:dp [ i ] = min ( dp [ i ] , dp [ i - w [ j ] × k ] + k ) ( k 表示当前纸币有几张,0 ≤ k ≤ num [ j ] 表示这类纸币的数量) 好了你就完成了此题的部分分,本人蒟蒻打死都…
多重背包二进制优化终于写了一次,注意j的边界条件啊,疯狂RE(还是自己太菜了啊啊)最辣的辣鸡 #include<bits/stdc++.h> using namespace std; int n,sum; ; ; ; const int inf=0x3f3f3f3f; int w[N*C],idx,num[N*C]; int b[N],c[N]; //面值 个数 int f[K],k; int main(){ scanf("%d",&n); ;i<=n;i++…
/* 这题卡常数.... 二进制优化或者单调队列会被卡 必须+上个特判才能过QAQ 单调队列维护之前的钱数有几个能拼出来的 循环的时候以钱数为步长 如果队列超过c[i]就说明队头的不能再用了 拿出来 时刻维护sum表示之前的+v[i]能凑出j来的有几种 注意先进队在更新f */ #include<iostream> #include<cstdio> #include<cstring> #define maxm 100010 #define maxn 110 using…
思路:把价值看做体积,而价值的大小还是其本身,那么只需判断1-m中的每个状态最大是否为自己,是就+1: #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #define Maxn 100010 #define Max(a,b) (a)>(b)?(a):(b) using namespace std; ],v[]; struct Que{ int pos,v…
Cut the Sequence Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8764   Accepted: 2576 Description Given an integer sequence { an } of length N, you are to cut the sequence into several parts every one of which is a consecutive subseque…