1. 程式人生 > >hdu 3466 Proud Merchants 【限制性01背包】

hdu 3466 Proud Merchants 【限制性01背包】

bbs struct style class mon main 例子 nts algorithm

題目鏈接:https://vjudge.net/contest/103424#problem/J

轉載於:https://www.bbsmax.com/A/RnJW16GRdq/

題目大意:

有n個商品m塊錢,給出買每個商品所花費的錢P、錢包裏需要至少Q才有資格買、商品的價值V。問你如何購買商品的價值最大。

解題分析:
考慮下面的例子:A:p1=5, q1=10, v1=5; B:p2=3, q2=5, v2=6; 如果先買物品A再買物品B的話我至少需要10元錢,也就是money >= p1+q2,如果先買物品B再買物品A的話,我們至少需要13元錢,也就是money >= p2+q1。得到相同的價值的物品,我們卻需要兩個不同價值的錢,當然我們選擇要花少的錢購買相同價值的商品了!


所以應使p1+q2 < p2+q1,交換位置p1-q1 < p2 - q2

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node{
    int p,q,v;
};
bool cmp(Node x,Node y)
{
    return (x.q - x.p) < (y.q - y.p);
}
int main()
{
    int N,M;
    while (~scanf("
%d%d",&N,&M)) { Node node[505]; int dp[5005]; memset(dp,0,sizeof(dp)); memset(node,0,sizeof(node)); for (int i = 0;i < N;i++) { scanf("%d%d%d",&node[i].p,&node[i].q,&node[i].v); } sort(node,node+N,cmp);
for(int i = 0;i < N;i++) { for (int j = M;j >= node[i].q;j--) { dp[j] = max(dp[j-node[i].p] + node[i].v,dp[j]); } } printf("%d\n",dp[M]); } return 0; }

2018-05-13

hdu 3466 Proud Merchants 【限制性01背包】