多次背包 O(NV)
来源:互联网 发布:云计算技术与应用专业 编辑:程序博客网 时间:2024/06/10 17:13
用优先队列来优化能把多重背包的复杂度从O(NMV) 优化到O(NV)
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int MaxN = 1000 + 5;int n,m,v[MaxN],gs[MaxN],que[MaxN<<1],lead,tail,last,now;double w[MaxN],f[2][MaxN<<1],add;char ch;void read(int &num){while(ch<'0'||ch>'9') ch=getchar();num=0;while(ch>='0'&&ch<='9') num=num*10+ch-'0',ch=getchar();}int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) {scanf("%lf",&w[i]);read(v[i]);read(gs[i]);if(v[i]==0) add+=gs[i]*w[i];}for(int i=1;i<=n;i++){now=i&1;last=now^1;for(int j=0;j<=m;j++) f[now][j]=0;for(int j=0;j<v[i];j++){lead=1;tail=0;for(int k=j;k<=m;k+=v[i]){while(lead<=tail&&(k-que[lead])/v[i]>gs[i]) lead++;while(lead<=tail&&f[last][que[tail]]-((que[tail]-j)/v[i])*w[i]<f[last][k]-((k-j)/v[i])*w[i]) tail--;que[++tail]=k;f[now][k]=f[last][que[lead]]+((k-que[lead])/v[i])*w[i];}}}double maxn=f[n&1][0];for(int i=1;i<=m;i++) maxn=max(maxn,f[n&1][i]);printf("%.2lf",maxn+add);return 0;}
0 0
- 多次背包 O(NV)
- O(NV)的完全背包算法 及 HDU 4508 湫湫系列故事——减肥记I (完全背包)
- 多重背包中多次背包 O(VN) 算法1 (单调队列优化) 带参考程序
- 多重背包中多次背包 O(VN) 算法 (线性动规) 带参考程序
- 多重背包中多次背包 O(VN) 算法1 (单调队列优化) 带参考程序
- poj 2063 多次完全背包
- poj2063 Investment(多次完全背包)
- o-1背包问题
- o-1背包问题
- o-1背包
- poj 1252 Euro Efficiency(多次完全背包)
- poj 1252 Euro Efficiency(多次完全背包)
- poj3211 Washing Clothes(多次01背包)
- poj 2063 Investment 多次完全背包
- HDU 2063 Investment(多次完全背包)
- POJ2063 Investment(多次完全背包)
- O题 分组背包变形
- 树形背包O(nm)求解
- 对称二叉树的判断
- 《实用技巧》——让你的网站变成响应式的3个简单步骤
- 最长公共子序列(LCS)
- 触发器
- 留学申请Google搜索技巧
- 多次背包 O(NV)
- Red and Black(DFS)
- 第一章——策略模式
- Diveintopython第十章getopt.getopt学习
- HDU 4912
- 链表的反转
- mysql UNIX时间戳与日期的相互转换
- JSONP跨域的原理解析
- GlusterFS分布式文件系统使用简介