Jzoj3223 Ede的新背包问题
来源:互联网 发布:js浏览器后退刷新页面 编辑:程序博客网 时间:2024/05/17 04:26
题意:多重背包,每次对于第i个物品不能选的情况求最大获益,n,m<1000,q<30000
最简单的方法肯定是暴力,每次询问都做一次背包,显然这样会超时
我们可以用二进制分拆法或者是用单调队列优化复杂度到O(qnm),可是依然不能过
注意到每次不能取的部分只有一个,那我们考虑用前缀和后缀分别维护,最后合并两个部分的答案
f[i][j]表示做到第i个物品的状态,g[i][j]表示倒着做i个物品的状态
最后合并两边即可
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int w[10000],v[10000],t[1000],N=0;int n,m,f[10010][1001],g[10010][1001];inline void ins(int W,int V){ //加入一个物品if(!W||!V) return;w[++N]=W; v[N]=V;}int calc(int x,int E){ //合并两边的答案if(!x) return g[t[1]][E];if(x==n-1) return f[t[n-1]-1][E];int *a=f[t[x]-1],*b=g[t[x+1]],ans=0;for(int i=0;i<=E;++i) ans=max(ans,a[i]+b[E-i]);return ans;}int main(){scanf("%d",&n);for(int a,b,c,i=0,j;i<n;++i){scanf("%d%d%d",&a,&b,&c); t[i]=N+1;for(j=0;1<<j<=c/2;++j) ins(a<<j,b<<j); //二进制拆分ins((c-(1<<j)+1)*a,(c-(1<<j)+1)*b);}for(int i=1;i<=N;++i){memcpy(f[i],f[i-1],4040);for(int j=1000;j>=w[i];--j)f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);}for(int i=N;i;--i){memcpy(g[i],g[i+1],4000);for(int j=1000;j>=w[i];--j)g[i][j]=max(g[i+1][j],g[i+1][j-w[i]]+v[i]);}scanf("%d",&m);for(int a,b,i=0;i<m;++i){scanf("%d%d",&a,&b);printf("%d\n",calc(a,b));}}
阅读全文
1 0
- JZOJ3223. 【HBOI2013】Ede的新背包问题
- Jzoj3223 Ede的新背包问题
- 【HBOI2013】Ede的新背包问题
- 3223. HEOI2013 Ede的新背包问题
- EDE
- [bzoj3163][HEOI2013]Eden的新背包问题
- BZOJ3163: [Heoi2013]Eden的新背包问题
- BZOJ3163: [Heoi2013]Eden的新背包问题
- BZOJ 3163 Heoi2013 Eden的新背包问题 多重背包
- 【bzoj3163】 HEOI2013Eden的新背包问题 多重背包
- 【bzoj3163】【Heoi2013】【Eden的新背包问题】【多重背包】
- 3163: [Heoi2013]Eden的新背包问题 多重背包
- bzoj 3163: [Heoi2013]Eden的新背包问题 多重背包
- emacs 工程管理工具 ede 的帮助文档
- 变形的背包问题
- 背包问题的算法
- “背包问题”的算法
- 背包问题的算法
- springmvc常用注解标签详解
- 【个人笔记重点,不作为参考】主题:provisional headers are shown 原因分析
- mui.fire传值首次无效
- java学习内容
- Java单例的由浅入深----懒汉式的升级(1 双重检查)
- Jzoj3223 Ede的新背包问题
- 使用zookeeper解决程序在不同集群之间运行的高可用
- (原创)Fragment详解(中)
- VB ini配置文件通式
- Zookeeper的API调用的同步和异步机制以及watcher机制总结
- hibernate多对多映射
- Kernel PCA 原理和演示
- 58
- 3分钟学会sessionStorage用法