hdu 3466 Proud Merchants 【限制性01背包】
阿新 • • 發佈:2018-05-13
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背包】