这个答案解决了我的一个疑惑,作为背包问题,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; }