HDU 3466 01背包变形

给出物品数量N和总钱数M

对于N个物品。每一个物品有其花费p[i], 特殊值q[i],价值v[i]

q[i] 表示当手中剩余的钱数大于q[i]时,才干够买这个物品

首先对N个物品进行 q-p的排序,表示差额最小的为最优。优先考虑放入这个物品

然后01背包计算

#include "stdio.h"
#include "string.h"
#include "algorithm"
using namespace std;

int inf=0x3f3f3f3f;

struct node
{
    int p,q,v;
}a[510];
int dp[5010];
int Max(int a,int b)
{
    if (a<b) return b;
    else return a;
}

bool cmp(node a,node b)
{
    return a.q-a.p<b.q-b.p;
}

int main()
{
    int n,m,i,j,ans;

    while (scanf("%d%d",&n,&m)!=EOF)
    {
        for (i=1;i<=n;i++)
            scanf("%d%d%d",&a[i].p,&a[i].q,&a[i].v);
        memset(dp,0,sizeof(dp));
        dp[0]=0;
        sort(a+1,a+1+n,cmp);

        for (i=1;i<=n;i++)
            for (j=m;j>=a[i].q;j--)
            {
                if (dp[j-a[i].p]+a[i].v>dp[j] )
                dp[j]=dp[j-a[i].p]+a[i].v;
            }

        ans=0;
        for (i=0;i<=m;i++)
            ans=Max(ans,dp[i]);

        printf("%d\n",ans);
    }
}
时间: 2024-08-26 13:35:59

HDU 3466 01背包变形的相关文章

hdu 2184 01背包变形

转自:http://blog.csdn.net/liuqiyao_01/article/details/8753686 题意:这是又是一道01背包的变体,题目要求选出一些牛,使smartness和funness值的和最大,而这些牛有些smartness或funness的值是负的,还要求最终的smartness之和以及funness之和不能为负. 这道题的关键有两点:一是将smartness看作花费.将funness看作价值,从而转化为01背包:二是对负值的处理,引入一个shift来表 示“0”,

hdu 2670 01背包变形

题意:有n个男孩,每个男孩对女神都有一个love值Li和递减值Bi(love值每天递减这么多).女神要从这n个男孩中选出k个男孩来一起去玩耍(每天选择一个男孩),要使这k个男孩的love值之和最大. 分析:当选定的男孩一定时,肯定要尽早选择递减较快的男孩,所以先按照递减值由大到小排序,然后做01背包即可,花费是占一个人数(n个人中选择k个),价值是那一天的love值. 总结一句话就是:排序然后求一个恰好装满的01背包. 1 #include <algorithm> 2 #include <

Proud Merchants HDU - 3466 01背包&amp;&amp;贪心

最近,我去了一个古老的国家.在很长一段时间里,它是世界上最富有.最强大的王国.结果,这个国家的人民仍然非常自豪,即使他们的国家不再那么富有.商人是最典型的,他们每个人只卖一件商品,价格是Pi,但是如果你的钱少于Qi,他们就会拒绝和你交易,而我评估每件商品的价值Vi.如果他有M单位的钱,iSea能得到的最大值是多少? 输入 在输入中有几个测试用例.每个测试用例以两个整数N M(1≤N≤500,1≤M≤5000)开始,表示项目编号和初始资金.接着N行,每一行包含3个数字Pi, Qi和Vi(1≤Pi≤

HDU 3466(01背包变种

http://acm.hdu.edu.cn/showproblem.php?pid=3466 http://www.cnblogs.com/andre0506/archive/2012/09/20/2695841.html 这道题多了一个限制条件Qi,低于Qi时不能购买. 解题思路是看更新量,因为限制条件限制的是更新量. 比如一个物品是5 9,一个物品是5 6,对第一个进行背包的时候只有dp[9],dp[10],…,dp[m],再对第二个进行背包的时候,如果是普通的,应该会借用前面的dp[8],

hdu 1171 01背包变形

背景:1Y对于背包写法,不太熟,想法也不够深,写起来,容易犯小错误. 思路:把sum/2当做背包的最大容量,求这个最大容量能够装下的最大价值,这个题的灵活之处就是把价值和体积都看做题中给的价值,那么相当于,一份体积有一份价值.所以sum/2的体积产生的价值势必小于等于sum/2,这样我们求出这个最接近sum/2的值即可. 这个题的思路比较巧妙,一是把看似两方面的问题转化为单方面要接近一半的问题,而单方面接近一半的问题又把价值既当做价值又当做体积转化为01背包问题. 学习:1.定义状态:F[j]为

HDU 1203 01背包变形题,(新思路)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1203 I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 33303    Accepted Submission(s): 13470 Problem Description Speakless很早就想出国,现在

HDU 2955 Robberies --01背包变形

这题有些巧妙,看了别人的题解才知道做的. 因为按常规思路的话,背包容量为浮点数,,不好存储,且不能直接相加,所以换一种思路,将背包容量与价值互换,即令各银行总值为背包容量,逃跑概率(1-P)为价值,即转化为01背包问题. 此时dp[v]表示抢劫到v块钱成功逃跑的概率,概率相乘. 最后从大到小枚举v,找出概率大于逃跑概率的最大v值,即为最大抢劫的金额. 代码: #include <iostream> #include <cstdio> #include <cstring>

HDU 2639 Bone Collector II(01背包变形【第K大最优解】)

Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4739    Accepted Submission(s): 2470 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took pa

codeforce Gym 101102A Coins (01背包变形)

01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define MAXW 15005 #define N 155 #define LL long long #define MOD 1000000007 int w1[N],w2[N]; LL dp1[MAXW],dp2[MAXW]; int main(