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

    代码:

    /*混合背包问题*/
    /*
    
    */
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    using namespace std;
    
    const int N = 1010;
    int f[N];
    
    int n, m;
    struct Thing
    {
        int kind;
        int v, w;
    };
    vector<Thing>things;
    
    int main()
    {
        cin >> n >> m;
        for (int i = 0; i < n; i++)
        {
            int v, w, s;
            cin >> v >> w >> s;
            if (s < 0)
                things.push_back({ -1, v, w });
            else if (s == 0)
            {
                things.push_back({ 0, v, w });
            }
            else
            {
                for (int k = 1; k <= s; k *= 2)//分离  每一部分都是01背包问题
                {
                    s -= k;
                    things.push_back({ -1, v*k, w*k });
                }
                if (s>0)
                {
                    things.push_back({ -1, v*s, w*s });
                }
            }
        }
        for (auto thing : things)
        {
            if (thing.kind < 0)//01背包
            {
                for (int j = m; j >= thing.v; j--)
                {
                    f[j] = max(f[j], f[j - thing.v] + thing.w);
                }
            }
            else
            {
                for (int j = thing.v; j <= m; j++)//完全背包
                {
                    f[j] = max(f[j], f[j - thing.v] + thing.w);
                }
            }
        }
        cout << f[m] << endl;
        return 0;
    }
    /*
  • 相关阅读:
    6.4 总结(关于正确率)
    POI2013 Bytecomputer
    BZOJ1485 有趣的数列
    PAM
    BZOJ1787 meet
    BZOJ3895 rock
    URAL 1996 Cipher Message 3
    BZOJ1468 Tree
    Javascript初识之数据类型
    Javascript初识之流程控制、函数和内置对象
  • 原文地址:https://www.cnblogs.com/gcter/p/11344925.html
Copyright © 2011-2022 走看看