hdu 5501 The Highest Mark(贪心+背包)

题目链接:hdu 5501 The Highest Mark

解题思路

先按照贪心值将每道题排序,保证在时间允许做完i和j时(i < j),先做i比先做j优,然后做一遍背包即可。

代码

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn = 1005;

struct State {
    int a, b, t;
    State(int a = 0, int b = 0, int t = 0):a(a), b(b), t(t) {}
    bool operator < (const State& u) const {
        return u.b * t < b * u.t;
    }
}G[maxn];

int N, T, dp[3 * maxn];

int main () {
    int cas;
    scanf("%d", &cas);
    while (cas--) {
        scanf("%d%d", &N, &T);
        memset(dp, 0, sizeof(dp));
        int a, b, t;
        for (int i = 0; i < N; i++) {
            scanf("%d%d%d", &a, &b, &t);
            G[i] = State(a, b, t);
        }
        sort(G, G + N);

        for (int i = 0; i < N; i++) {
            a = G[i].a, b = G[i].b, t = G[i].t;
            for (int j = T; j >= t; j--)
                dp[j] = max(dp[j], dp[j-t] + a - b * j);
        }
        int ans = 0;
        for (int i = 0; i <= T; i++) ans = max(ans, dp[i]);
        printf("%d\n", ans);
    }
    return 0;
}

你可能感兴趣的:(hdu 5501 The Highest Mark(贪心+背包))