hdu2191多重背包单调队列优化
2013-07-15 16:06
399 查看
多重背包单调队列优化:
dp[c+i*p]=max(dp[c+k*p]+(i-k)*h);
每种背包的容量p,价值h,c的范围为0~p-1,i和k的范围为0~num(能够取的背包的数量)
背包的取法可以看做是划分为0~p-1这p个容量再加上i个背包。
dp[c+i*p]=dp[c+k*p]-k*h+i*h;
代码:
dp[c+i*p]=max(dp[c+k*p]+(i-k)*h);
每种背包的容量p,价值h,c的范围为0~p-1,i和k的范围为0~num(能够取的背包的数量)
背包的取法可以看做是划分为0~p-1这p个容量再加上i个背包。
dp[c+i*p]=dp[c+k*p]-k*h+i*h;
代码:
#include<iostream> #include<vector> #include<string> #include<queue> #include<map> #include<cstdio> #include<cstring> #define maxn 2000 #define INF 0xfffffff #define min(a,b) a<b?a:b #define max(a,b) a>b?a:b using namespace std; struct node { int f; int pos; }; node q[maxn]; int dp[maxn]; int n,m,p,h,num,head,tail,nowf; int main() { int t; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); scanf("%d%d",&n,&m);//总钱数n for(int i=1;i<=m;i++) { scanf("%d%d%d",&p,&h,&num);//价格,重量,袋数 num=min(num,n/p); for(int j=0;j<p;j++)//0~p-1种 { head=tail=0; for(int k=0;k<=(n-j)/p;k++) { nowf=dp[j+p*k]-k*h; while(head<tail&&q[tail-1].f<=nowf) tail--; q[tail].f=nowf,q[tail++].pos=k; while(head<tail&&q[head].pos<k-num)//是否能通过增加num达到k head++; dp[j+k*p]=q[head].f+k*h; } } } printf("%d\n",dp ); } return 0; }
相关文章推荐
- hdu 2191 (多重背包的单调队列优化)
- HDU 1171 Big Event in HDU (多重背包+单调队列优化)
- HDU 1171 Big Event in HDU (单调队列优化多重背包)
- hdu 2191(单调队列优化多重背包模板)
- HDU1171 单调队列优化多重背包O(VN)
- hdu 2844 多重背包+单调队列优化
- POJ 1742 Coins 多重背包用单调队列优化
- hdu 3401(单调队列优化dp)
- POJ 1742 Coins( 单调队列优化多重背包)
- HDU - 4362 Dragon Ball(单调队列优化的DP)@
- HDU 5945 浅谈单调队列优化线性动态规划方程
- hdu-3401-Trade-单调队列优化的DP
- poj 1276 多重背包+二进制优化+单调队列优化
- hdu Max Sum of Max-K-sub-sequence 单调队列优化DP
- hdu 5495 Fxx and game(dp+单调队列优化)
- HDU 4362 单调队列优化DP
- poj1742coins【单调队列优化多重背包】楼教主八题
- hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 单调队列优化dp
- hdu 3401 Trade 单调队列优化dp
- [Bzoj4182]Shopping(点分治)(树上背包)(单调队列优化多重背包)