单调队列优化多重背包

单调队列优化多重背包_第1张图片

 附上计蒜客官方讲解:

单调队列优化多重背包_第2张图片

单调队列优化多重背包_第3张图片

单调队列优化多重背包_第4张图片

单调队列优化多重背包_第5张图片

 

HDU 2191为例

#include
 
using namespace std;
 
int n,m,l,r;
 
int dp[110],q[110],num[110];
 
int main()
{
    int cs,v,w,c;
    scanf("%d",&cs);
    while(cs--){
        scanf("%d%d",&m,&n);            //m表示容量,n表示种类。
        for(int i=0;i<=m;i++){
            dp[i]=0;
        }
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&v,&w,&c);   //v 体积  w  价值  c 数量
            if(c>m/v) c=m/v;
            for(int b=0;bc) l++;         //滑动区间长度不大于c,因为dp[t*v+b]-t*w既然存在,那么再加c区间的t*w的值肯定能取到
                    dp[t*v+b]=max(dp[t*v+b],q[l]+t*w);  //因为dp中的是t*v+b,所以是q[l]+t*w
                }
            }
        }
        printf("%d\n",dp[m]);
    }
    return 0;
}

 

你可能感兴趣的:(动态规划,模板)