• Codevs 3269 混合背包(二进制优化)


    3269 混合背包
    时间限制: 1 s
    空间限制: 256000 KB
    题目等级 : 钻石 Diamond
    传送门
    题目描述 Description
    背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至多取1件,要么至多取mi件(mi > 1) , 要么数量无限 , 在所装物品总体积不超过V的前提下所装物品的价值的和的最大值是多少?
    输入描述 Input Description
    第一行两个数N,V,下面N行每行三个数Vi,Wi,Mi表示每个物品的体积,价值与数量,Mi=1表示至多取一件,Mi>1表示至多取Mi件,Mi=-1表示数量无限
    输出描述 Output Description
    1个数Ans表示所装物品价值的最大值
    样例输入 Sample Input
    2 10
    3 7 2
    2 4 -1
    样例输出 Sample Output
    22
    数据范围及提示 Data Size & Hint
    对于100%的数据,V <= 200000 , N <= 200
    分类标签 Tags
    动态规划 背包型DP 线性结构 队列

    /*
    二进制拆01背包.
    */
    #include<iostream>
    using namespace std;
    int i,n,k,l;
    int v[201],w[201],m[201],vz[20001],wz[20001],f[200001],tot;
    void yh()//二进制优化
    {
    for(int i=1;i<=n;i++)
     {
      if(m[i]>1)
     {
      for(int j=1;j<=m[i];j<<=1)
      {
      vz[++tot]=v[i]*j;
      wz[tot]=w[i]*j;
      m[i]-=j;
    }
    if(m[i])
    {
    vz[++tot]=v[i]*m[i];
    wz[tot]=w[i]*m[i];
    }
      } 
    }
    }
    int main()
    {
    int V;
    cin>>n>>V;
    for(i=1;i<=n;++i)
    {
    cin>>v[i]>>w[i]>>m[i];
    }
    yh();
    for(i=1;i<=n;++i)
    {
    if(m[i]==-1)
    {
    for(int j=v[i];j<=V;++j)
     f[j]=max(f[j],f[j-v[i]]+w[i]);
    }
    }
    for(int i=1;i<=tot;i++)
    {
    for(int j=V;j>=vz[i];j--)
    {
    f[j]=max(f[j],f[j-vz[i]]+wz[i]);
    }
    }
    cout<<f[V];
    return 0;
    }
  • 相关阅读:
    1JavaScript的历史
    扯扯 require .js
    查看js 执行效率工具
    php 输入输出流
    词法分析096
    Python基础综合练习
    096
    大数据概述
    熟悉常用的Linux操作
    实验一、词法分析实验
  • 原文地址:https://www.cnblogs.com/nancheng58/p/6070817.html
Copyright © 2020-2023  润新知