poj 3260 双端队列优化多重背包+完全背包
2017-04-14 07:32
621 查看
#include<cstdio> #include<cstring> #define MAX(x,y) ((x)>(y)?(x):(y)) #define MIN(x,y) ((x)>(y)?(y):(x)) #define MAX_N 100200 using namespace std; int dp1[MAX_N],dp2[MAX_N]; int n,m,num; int c[MAX_N],v[MAX_N]; void solve() { memset(dp2,0x3f,sizeof(dp2)); dp2[0]=0; for(int i=0;i<n;i++) { for(int j=v[i];j<=m+num;j++) { dp2[j]=MIN(dp2[j],dp2[j-v[i]]+1); } } } void solve1() { int deqv[100000],deq[100000]; memset(dp1,0x3f,sizeof(dp1)); dp1[0]=0; for(int i=0;i<n;i++) { for(int a=0;a<v[i];a++) { int s=0,t=0; for(int j=0;j*v[i]+a<=m+num;j++) { int val=dp1[j*v[i]+a]-j; while(s<t&&deqv[t-1]>=val) t--; deq[t]=j; deqv[t++]=val; dp1[j*v[i]+a]=deqv[s]+j; if(deq[s]==j-c[i]) s++; } } } } int main() { scanf("%d%d",&n,&m); num=0; for(int i=0;i<n;i++) { scanf("%d",&v[i]); num=MAX(num,v[i]); } num*=num; for(int i=0;i<n;i++) scanf("%d",&c[i]); solve1(); solve(); int res=0x3f3f3f3f; for(int i=num+m;i>=0;i--) { res=MIN(res,dp1[i+m]+dp2[i]); } if(res==0x3f3f3f3f) printf("-1\n"); else printf("%d\n",res); return 0; }
相关文章推荐
- POJ 3260 The Fewest Coins(完全背包 + 多重背包 + 单调队列优化)
- POJ3260_The Fewest Coins_deque优化dp解多重背包和完全背包
- poj 3260 The Fewest Coins (多重背包 + 完全背包)
- poj 3260 The Fewest Coins(多重背包+完全背包)
- poj1742 Coins(多重背包+单调队列优化)
- 关于双端队列优化多重背包问题的学习笔记
- POJ 3260 The Fewest Coins 多重背包+完全背包
- POJ 1742 Coins 多重背包用单调队列优化
- POJ 1742 Coins( 单调队列优化多重背包)
- POJ 3260 The Fewest Coins(完全背包+多重背包(转化为01背包))
- POJ 3260 The Fewest Coins(动态规划+多重背包+完全背包)
- POJ - 1742 Coins 多重背包+(二进制优化||单调队列优化)
- poj 2373 单调队列优化背包
- POJ 3260 The Fewest Coins (多重背包 + 完全背包)
- 背包问题--POJ 3260 The Fewest Coins【完全背包+多重背包】
- poj 2754 Similarity of necklaces 2 转换成多重背包,单调队列优化/ 二进制优化
- POJ 3260 The Fewest Coins(多重背包+完全背包—>交易数量最小)@
- POJ 3260 The Fewest Coins (混合背包--多重背包+完全背包)
- poj 3260(多重+完全背包)
- POJ 1742:Coins——单调队列优化的多重背包