您的位置:首页 > 其它

HDU 3466 Proud Merchants (01背包)

2016-05-05 19:31 302 查看
题意:输入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\n", dp[m]);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: