#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[5010];
struct good {
int p, q, v;
};
good gd[510];
bool cmp(good a, good b) {
return (a.p - a.q) > (b.p - b.q);
}
int main() {
int n, m;
while(~scanf("%d%d", &n, &m)) {
int p, q, v;
memset(a, 0, sizeof(a));
for(int i = 1; i <= n; i++)
scanf("%d%d%d", &gd[i].p, &gd[i].q, &gd[i].v);
sort(gd + 1, gd + 1 + n, cmp);
for(int i = 1; i <= n; i++) {
for(int k = m; k >= gd[i].q; k--)
a[k] = max(a[k], a[k - gd[i].p] + gd[i].v);
}
printf("%d\n", a[m]);
}
return 0;
}
hdu 5501
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[3010];
struct Node {
int a, b, c;
};
Node node[1010];
bool cmp(Node x, Node y) {
return x.c * y.b < y.c * x.b;
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
int n, t;
scanf("%d%d", &n, &t);
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; i++) scanf("%d%d%d", &node[i].a, &node[i].b, &node[i].c);
sort(node + 1, node + 1 + n, cmp);
for(int i = 1; i <= n; i++) {
for(int k = t; k >= node[i].c; k--)
dp[k] = max(dp[k], dp[k - node[i].c] + (node[i].a - node[i].b * k));
}
int ans = 0;
for(int i = 0; i <= t; i++) ans = max(ans, dp[i]);
printf("%d\n", ans);
}
return 0;
}
选择同样的物品,而选择的顺序不一样导致结果不同的背包需要排序。
按照什么排序,要好好想想啊!