多重背包
总是反反复复的学着已经学习过的东西,只希望自己有朝一日可以挣脱这枷锁。。
小文艺一下,下面我贴上自己经常用的两个关于多重背包的优化的模板,还记得以前找单调队列的优化的时候,找了很多地方,加上自己那时候单调队列懵懵懂懂的感觉,就觉得特别困难。希望对别人能有所帮助。我值提供代码,要看详细解释的背包九讲及其很多地方会有很好的解释的。
二进制的优化:
View Code
for(int i=1;i<=n;i++) { int s,count,tmp; s=0,count=1,tmp=num[i]; while(s<tmp) { for(int j=sum;j>=cost[i]*count;j--) dp[j]=max(dp[j],dp[j-count*cost[i]]+count*val[i]); s+=count; if(tmp-s<count*2) count=tmp-s; else count*=2; } }
单调队列优化:
View Code
struct Node { int tag; int val; Node(int t=0,int v=0):tag(t),val(v){} }que[maxm]; for(int i=1;i<=n;i++) { scanf("%d %d %d",&c,&w,&num); num=min(num,m/c); for(int k=0;k<c;k++) { int head,tail; head=1,tail=0; for(int j=0;j<=(m-k)/c;j++) { int tmp=dp[j*c+k]-j*w; while(head<=tail&&que[tail].val<=tmp) tail--; que[++tail]=Node(j,y) while(que[head].tag<j-num) head++; dp[j*c+k]=que[head].val+j*w; } } }
每天的每天都告诉自己,加油!
勸君惜取少年時&莫待無花空折枝
posted on 2013-05-01 15:51 Raining Days 阅读(232) 评论(0) 编辑 收藏 举报