1036Gangsters

这个答案解决了我的一个疑惑,作为背包问题,f[i]表示是能与不能,但做到这个还不够,我们还要找到最好的一个,也就是说实现与找到的分开

//////////////////////////////////////////////////////////////////////////
//        POJ1036  Gangsters
//        Memory: 284K        Time: 0MS
//        Language: C++        Result: Accepted
//////////////////////////////////////////////////////////////////////////

#include <iostream>
#include <algorithm>

using namespace std;

struct Ganster {
    int t;
    int p;
    int s;
};
Ganster g[101];
int N, K, T;
int dp[101];
int ans = 0;
bool visited[101];
inline bool operator<(const Ganster & p1, const Ganster & p2) {
    return p1.t == p2.t ? (p1.s == p2.s ? p1.p < p2.p : p1.s < p2.s) : p1.t < p2.t;
}
int main() {
    cin >> N >> K >> T;
    for (int i = 1; i <= N; ++i) {
        cin >> g[i].t;
    }
    for (int i = 1; i <= N; ++i) {
        cin >> g[i].p;
    }
    for (int i = 1; i <= N; ++i) {
        cin >> g[i].s;
    }
    sort(g, g + N + 1);
    g[0].t =g[0].p = g[0].s = 0;
    visited[0] = true;
    for (int i = 1; i <= N; ++i) {
        for (int j = 0; j < i; ++j) {
            if (visited[j]) {
                if (g[i].t - g[j].t >= abs(g[i].s - g[j].s)) {
                    dp[i] = max(dp[i], dp[j] + g[i].p);//更新放i进去能获得的最大财产
                }
            }
        }
        visited[i] = (bool)dp[i];
        ans = max(ans, dp[i]);
    }
    cout << ans << endl;
    system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/dowson/p/3259793.html