zoukankan      html  css  js  c++  java
  • 多重背包的单调队列优化

    有 NN 种物品和一个容量是 VV 的背包。

    第 ii 种物品最多有 sisi 件,每件体积是 vivi,价值是 wiwi。

    求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
    输出最大价值。

    输入格式

    第一行两个整数,NV (0<N≤1000, 0<V20000),用空格隔开,分别表示物品种数和背包容积。

    接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。

    输出格式

    输出一个整数,表示最大价值。

    数据范围

    0<N1000
    0<V20000
    0<vi,wi,si20000

    提示

    本题考查多重背包的单调队列优化方法。

    附上代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int M=20010,N=1010;
    int f[M],g[M];
    int n,m;
    int que[M];
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            int v,w,s;
            cin>>v>>w>>s;
            memcpy(g,f,sizeof f);
            for(int r=0;r<v;r++)//余数处理
            {
                int head=0,tail=-1;
                for(int k=0;r+k*v<=m;k++)
                {
                    if(head<=tail&&k-que[head]>s) head++;
                    while(head<=tail&&g[r+k*v]-k*w>=g[r+que[tail]*v]*que[tail]*w) tail++;
                    que[++tail]=k;
                    f[r+k*v]=g[r+que[head]*v]+(k-que[head])*w;
                }
            } 
        }
        cout<<f[m]<<endl;
    }
  • 相关阅读:
    Spring Cloud
    Hibernate 缓存
    Spring 快速入门
    Junit 单元测试
    Spring Cloud 笔记
    Swagger SpringBoot 集成
    Apache Shiro 权限框架
    Spring Boot
    跨域问题
    BeX5 常见问题解决办法
  • 原文地址:https://www.cnblogs.com/hrlsm/p/12859532.html
Copyright © 2011-2022 走看看