zoukankan      html  css  js  c++  java
  • 逃亡的准备(多重背包+二进制优化)

    逃亡的准备

    问题描述:
    在《Harry Potter and the Deathly Hallows》中,Harry Potter他们一起逃亡,现在有许多的东西要放到赫敏的包里面,但是包的大小有限,所以我们只能够在里面放入非常重要的物品,现在给出该种物品的数量、体积、价值的数值,希望你能够算出怎样能使背包的价值最大的组合方式,并且输出这个数值,赫敏会非常地感谢你。
    输入描述:
    (1)第一行有2个整数,物品种数n和背包装载体积v。
    (2)2行到n+1行每行3个整数,为第i种物品的数量m、体积w、价值s。.
    输出格式
    输出描述:
    仅包含一个整数,即为能拿到的最大的物品价值总和。
    样例输入:
    2 10
    3 4 3
    2 2 5
    样例输出:
    13
    样例解释:选第一种一个,第二种两个。
    数据规模:
    对于30%的数据
    1<=v<=500
    1<=n<=2000
    1<=m<=10
    1<=w<=20
    1<=s<=100
    对于100%的数据
    1<=v<=500
    1<=n<=2000
    1<=m<=5000
    1<=w<=20
    1<=s<=100

    #include<iostream>
    using namespace std;
    const int maxn=25000000;
    int n,V,tot,tv[maxn],tw[maxn],v[maxn],m[maxn],w[maxn],f[maxn];
    void optimize()//二进制优化 
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m[i];j<<=1)
            {
                tw[++tot]=j*w[i];
                tv[tot]=j*v[i];
                m[i]-=j;
            }
            if(m[i])
            {
                tw[++tot]=m[i]*w[i];
                tv[tot]=m[i]*v[i];
            }
        }
    }
    int main()
    {
        cin>>n>>V;
        for(int i=1;i<=n;i++)
        cin>>m[i]>>w[i]>>v[i];
        optimize();//二进制优化 
        for(int i=1;i<=tot;i++)
          for(int j=V;j>=tw[i];j--)
          f[j]=max(f[j],f[j-tw[i]]+tv[i]);
        cout<<f[V];
        return 0;
    }
  • 相关阅读:
    SQL Server控制语句
    MATLAB中取整函数(fix, floor, ceil, round)的使用
    MATLAB程序设计
    Thinking In Java<<Java编程思想>>
    Boost::bimap
    MySQL学习随笔1
    Boost 1_42_0在windows下的编译及其设置
    MySQL执行mysql脚本及其脚本编写
    Pygame介绍
    Erlang
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070930.html
Copyright © 2011-2022 走看看