zoukankan      html  css  js  c++  java
  • HDU 3466 Proud Merchants (01背包)

    题意:输入n,m,表示有n个物品,m单位的钱,接下来输入n行 p, q, v 分别表示 花费, 手中需要有的费用, 价值。求最多能够取得的价值。

    分析:如果没有q的话就是简单的01背包,加入q这个限制条件后,需要对物品的q-p进行升序排序。

    原因:

    for (i=1; i<=n; i++)

       for (j=m; j>=q[i]; j--)

        dp[j]=max(dp[j], dp[j-p[i]]+v[i]);

    算i时,最小能算到q[i]-p[i],需要先把最小的求出来。因此以q[i]-p[i]从小到大排序
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    
    const int maxn = 505;
    
    struct A
    {
        int p, q, v;
    }a[maxn];
    int dp[maxn*10];
    
    bool cmp(A x1, A x2)
    {
        return x1.q-x1.p<x2.q-x2.p;
    }
    
    int main()
    {
        int n, m;
        while(~scanf("%d%d", &n, &m))
        {
            for(int i=1; i<=n; i++)
            {
                scanf("%d %d %d", &a[i].p, &a[i].q, &a[i].v);
            }
            sort(a+1, a+n+1, cmp);
            memset(dp, 0, sizeof(dp));
            for(int i=1; i<=n; i++)
            {
                for(int j=m; j>=a[i].q; j--)
                {
                    dp[j] = max(dp[j-a[i].p]+a[i].v, dp[j]);
                }
            }
            printf("%d
    ", dp[m]);
        }
    
        return 0;
    }
  • 相关阅读:
    OCP-1Z0-053-V12.02-235题
    OCP-1Z0-053-V12.02-524题
    OCP-1Z0-053-V12.02-525题
    OCP-1Z0-053-V12.02-526题
    OCP-1Z0-053-V12.02-535题
    OCP-1Z0-053-V12.02-540题
    OCP-1Z0-053-V12.02-617题
    OCP-1Z0-053-V12.02-649题
    如何制作Jar包并在android中调用jar包
    JAVA实现回调
  • 原文地址:https://www.cnblogs.com/mengzhong/p/5463014.html
Copyright © 2011-2022 走看看