题意: 给出N个物品有P(价格),Q(现在金钱不小于Q才能购买),V(价值)三个属性,求在给定初始金钱M的条件下最大购买价值(Q>=P)
分析:因为Q的属性为金钱不小于Q才能购买,那么就不能按照01背包那样随机拿了,我们要考虑尽可能购买更多的东西,即使能购买的东西最大,又购买了一件物品总金钱会减少P,然后金钱不小于Q才能购买,所以我们需要在P和Q之间做一个权衡,即可以按Q-P排序物品
AC代码:
/*************************************************************************
> File Name: test.cpp
> Author: Akira
> Mail: qaq.febr2.qaq@gmail.com
************************************************************************/
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <algorithm>
#include <bitset>
#include <queue>
#include <stack>
#include <map>
#include <cmath>
#include <vector>
#include <set>
#include <list>
#include <ctime>
#include <climits>
typedef long long LL;
typedef unsigned long long ULL;
typedef long double LD;
#define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0)
#define Sqr(a) ((a)*(a))
using namespace std;
#define MaxN 505
#define MaxM 5005
#define INF 0x3f3f3f3f
#define PI 3.1415926535897932384626
const int mod = 1E9+7;
#define bug cout<<88888888<<endl;
int N, M;
struct Node
{
int P,Q,V;
bool operator <(const Node &a) const
{
return a.Q-a.P>Q-P;
}
}node[MaxN];
int DP[MaxM];
void solve()
{
CLR(DP);
sort(node,node+N);
for(int i=0;i<N;i++)
{
for(int j=M;j>=node[i].Q;j--)
{
DP[j] = max(DP[j], DP[j-node[i].P]+node[i].V);
}
}
int ans = 0;
printf("%d\n", DP[M]);
}
int main()
{
//std::ios::sync_with_stdio(false);
while(~scanf("%d%d", &N, &M))
{
for(int i=0;i<N;i++)
{
scanf("%d%d%d", &node[i].P, &node[i].Q, &node[i].V);
}
solve();
}
//system("pause");
}