这道题目真是开了眼界,厉害厉害,刚开始直接把q排序了,直接WA,看来神牛的解答之后才明白了要按照q-p去排列,仔细想想看,考虑特殊情况如果q-p=0的时候就是普通的01背包,按照q排肯定是有问题的,但是按照q-p去排其实就是在数组跟新的过程的中影响状态的数目,q-p越大,那么影响后面状态的数目就越大,然而具体的数学证明真的不会,只是用特殊的例子自己推演了几遍。。。
题目链接:https://vjudge.net/problem/HDU-3466
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 505;
int cntn , cntm;
int dp[5005];
struct Node {
int p ,q , v;
Node(int p=0 ,int q=0 , int v=0) : p(p),q(q),v(v) {}
bool operator < (const Node& rhs) const {
return q-p < rhs.q-rhs.p;
}
}node[maxn];
void solve () {
for (int i = 1 ; i <= cntn ; i++) {
for (int j = cntm ; j >= node[i].q ; j--)
dp[j] = max(dp[j] , dp[j-node[i].p]+node[i].v);
}
printf ("%d\n" , dp[cntm]);
}
int main () {
while (scanf("%d%d" , &cntn , &cntm) != EOF) {
memset(dp,0,sizeof(dp));
memset(node,0,sizeof(node));
for (int i = 1 ; i <= cntn ; i++)
scanf ("%d%d%d" , &node[i].p , &node[i].q , &node[i].v);
sort(node+1 , node+cntn+1);
solve();
}
}