codevs 5429 完全背包】的更多相关文章

5429 多重背包 http://codevs.cn/problem/5429 分析: f[i]=g[j-k*siz[i]]+k*val[i]; 发现一个状态d只会更新,d+siz[i],d+2*siz[i]...d+k*siz[i],所以可以枚举每个d,d<m,然后将d的倍数提出来(就是一个剩余系),然后这些状态就是随便转移了,然后单调队列优化.复杂度O(nm). 代码: #include<cstdio> #include<algorithm> #include<cs…
单调队列优化. 好像有点烦...调了许久. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 7050 using namespace std; long long n,m,v[maxn],w[maxn],c[maxn],up[maxn],q[maxn],l,r,ret1,ret2,val[maxn],dp[maxn]; void ge…
3269 混合背包 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至多取1件,要么至多取mi件(mi > 1) , 要么数量无限 , 在所装物品总体积不超过V的前提下所装物品的价值的和的最大值是多少? 输入描述 Input Description 第一行两个数N,V,下面N行每行三个数Vi,Wi,Mi表示每个物品的体积,价值与数量,Mi…
题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至多取1件,要么至多取mi件(mi > 1) , 要么数量无限 , 在所装物品总体积不超过V的前提下所装物品的价值的和的最大值是多少? 输入描述 Input Description 第一行两个数N,V,下面N行每行三个数Vi,Wi,Mi表示每个物品的体积,价值与数量,Mi=1表示至多取一件,Mi>1表示至多取Mi件,Mi=-1表示数量无限 输出描述 Output Descriptio…
传送门 [题目大意]给出物品的数量.-1为无限个. [思路]混合背包.... [code] #include<iostream> #include<cstdio> #include<cstdlib> using namespace std; ],v[],c[],dp[]; int main() { int vv,n; scanf("%d%d",&n,&vv); ;i<=n;i++) scanf("%d%d%d"…
多重背包问题: 有n件物品,第i件价值为wi,质量为vi,有c1件,问,给定容量V,求获得的最大价值. 朴素做法: 视为0,1,2,...,k种物品的分组背包 [每组只能选一个] f[i][j]=Max(f[i][j-k*v[i]]+k*w[i]) 但是i,j,k都要枚举,复杂度为 n*V*k 朴素做法的改进: 因为发现用二进制可以表示1..k之内的所有数 [整数二进制打开后为01串,所以可以被二进制表示] 所以将k个物品拆分成1,2,4...2^m,k-2^m   ( 其中2^m<=k<2^…
/*poj 1463 最小点覆盖 匈牙利*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 1510 using namespace std; int n,num,head[maxn],match[maxn],c[maxn],ans; bool f[maxn]; struct node{ int v,pre; }e[maxn*]; int init(){ ;char s=getcha…
单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j <= i 普通的做法是O(nlogn),但是当n很大是,这个复杂度就不行了,考虑用单调队列优化来达到O(n). 单调队列优化dp时维护的一般都是两个值{ id(下标),value(值)},且它们都保持单调. 对于这个问题,我们维护一个两个值都单调递增的序列. 查询:队首不断删除,直到队首下标大于等于i…
codevs 1378 选课 时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond  题目描述 Description 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修了这M门课并考核通过就能获得相应的学分. 在选修课程中,有些课程可以直接选修,有些课程需要一定的基础知识,必须在选了其它的一些课程的基础上才能选修.例如<Frontpage>…
先通过并查集处理出来有多少种不同的集合,每一个集合有多少人.一定要不要忘记了与别的没有联系的独立点. 并查集的时候能够通过hash处理出来每一个数目同样的集合的个数. 这样以人数为权值.个数为限制进行多重背包,结果就是答案. 题目链接:http://codevs.cn/problem/3372/ #include <algorithm> #include <iostream> #include <stdlib.h> #include <string.h> #…