• 混合背包


    【题目描述】

    现有一个体积为V的背包,给定N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么取一件,要么取Mi件(Mi > 1),要么数量无限,询问在所装物品总体积不超过V的前提下,所装物品的价值和最大值是多少。

    【输入描述】

    第一行输入两个数N、V;

    接下来N行,每行输入三个数Vi、Wi、Mi,表示每个物品的体积、价值与数量,Mi=1表示至多取一件,Mi>1表示至多取Mi件,Mi=-1表示数量无限。

    【输出描述】

    输出一个数,表示所装物品的价值最大值。

    【样例输入】

    2 10

    3 7 2

    2 4 -1

    【样例输出】

    22

    【数据范围及提示】

    对于100%的数据,V <= 200000,N <= 200。

    源代码:
    
    #include<cstdio>
    int n,v,s(0),h[100001],i[100001],f[200001]={0};
    int main()
    {
        scanf("%d%d",&n,&v);
        for (int a=1;a<=n;a++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            if (z==-1)
              z=v/x; //此物品至多的个数。 
            for (int b=1;b<=z;b<<=1) //二进制优化。 
            {
                h[++s]=b*x;
                i[s]=b*y;
                z-=b;
            }
            if (z)
            {
                h[++s]=z*x;
                i[s]=z*y;
            }
        }
        for (int a=1;a<=s;a++)
          for (int b=v;b>=h[a];b--)
            f[b]=f[b]>f[b-h[a]]+i[a]?f[b]:f[b-h[a]]+i[a]; //多重背包。 
        printf("%d",f[v]);
        return 0;
    }
  • 相关阅读:
    docker 容器与主机之间的数据copy
    vim 中如何快速注释和取消注释
    java查找字符中的某个内容并替换
    linux正则表达式
    数据流重定向与管道命令
    linux杂七杂八
    linux变量
    redis常用命令操作
    redis基本操作介绍
    redis数据结构
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5276839.html
Copyright © 2020-2023  润新知