dp[i][j]表示当第i个海盗进门时门的状态为k,这时获得的最多钱 #include <iostream> #include <algorithm> using namespace std; int n, k, time, r; struct INFO { int T; int P; int S; } info[102]; int dp[101][101]; //dp[i][j]表示当第i个海盗进门时门的状态为k,这时获得的最多钱 bool comp(INFO& info1, INFO& info2) { return info1.T<info2.T; } #define max(a,b) ((a)>(b)?(a):(b)) int main() { int i, j, sel, ans, cur, state, begin, end, add; while( cin >> n >> k >> time) { memset(info, 0, sizeof(info)); for (i=1; i<=n; i++) cin >> info[i].T; for (i=1; i<=n; i++) cin >> info[i].P; for (i=1; i<=n; i++) cin >> info[i].S; sort(info+1, info+n+1, comp); memset(dp, -1, sizeof(dp)); dp[0][0] = 0; for (i=0; i<n; i++) //第i个海盗 { for (j=0; j<=k; j++) //第j个状态 { if (dp[i][j] != -1) { begin = j + info[i].T - info[i+1].T; if (begin<0) begin = 0; end = j + info[i+1].T - info[i].T; if (end>k) end = k; for (state=begin; state<=end; state++) { add = 0; if (state == info[i+1].S) add += info[i+1].P; dp[i+1][state] = max(dp[i+1][state], dp[i][j] + add); } } } } ans = 0; for (j=0; j<=k; j++) ans = max(ans, dp[n][j]); cout << ans << endl; } return 0; }