zoukankan      html  css  js  c++  java
  • HDU3466-Proud Merchants(01背包变形)

    需要排序的01背包。

    这种题排序时只需要考虑两个怎么排,重载小于号就可以了。

    需要注意的是,如果一个物品你想先放进背包里,那么你排序是要放到后面!01背包的放置顺序的倒着的!

    看到别人的博客都只是比较了q-p,表示不解,但是都能AC。。。是谁错了呢?或者我这种表达式可以化成那个样子?

    AC代码:

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    
    // (1 ≤ N ≤ 500, 1 ≤ M ≤ 5000),  (1 ≤ Pi ≤ Qi ≤ 100, 1 ≤ Vi ≤ 1000),
    
    int p[505], q[505], v[505];
    int dp[5005];
    
    /**
    n个物品,有qi的钱才能买,需要花费pi,价值vi,求最大价值
    直接01背包会出错,需要排序。
    排序时考虑其中两个物品i,j
    买i,j和买j,i分别需要max(q[i], p[i]+q[j]) max(q[j], p[j]+q[i])
    */
    
    struct node{
        int p, q, v;
        bool operator < (const node a) const
        {
            //return q > a.q;
            int x = max(q, p + a.q);
            int y = max(a.q, a.p + q);
            return x > y;
        }
    } a[505];
    
    int main()
    {
        int n, m;
        while (cin >> n >> m)
        {
            for (int i = 0; i < n; ++i)
                cin >> a[i].p >> a[i].q >> a[i].v;
            sort(a, a + n);
            memset(dp, 0, sizeof dp);
            for (int i = 0; i < n; ++i)
            {
                for (int j = m; j >= a[i].q; --j)
                {
                    dp[j] = max(dp[j], dp[j - a[i].p] + a[i].v);
                }
            }
            cout << dp[m] << endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    Eclipse 插件安装、升级和卸载的方法
    Eclipse中Spring插件的安装
    为eclipse离线安装hibernate tools插件
    Eclipse中Hibernate插件的安装
    Nginx安装配置
    app自动更新(android)
    PhoneGap应用图标icon和启动页面SplashScreen
    highcharts图表的图例legend
    安装android的sdk
    设置全屏
  • 原文地址:https://www.cnblogs.com/wenruo/p/4930624.html
Copyright © 2011-2022 走看看