zoukankan      html  css  js  c++  java
  • 混合背包

    【题目描述】

    现有一个体积为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;
    }
  • 相关阅读:
    Spring实现声明式事务
    Spring整合MyBatis
    Spring AOP
    代理模式
    Bean的作用域
    Spring的配置
    HQL题目记录以及解题思路--持续更新
    数仓学习之路一:数仓理论
    DBeaver连接Hive遇到的坑
    MySQL常见面试题
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5276839.html
Copyright © 2011-2022 走看看