Untitled
unknown
plain_text
a year ago
1.5 kB
6
Indexable
#include <iostream> #define MAX_N 20 #define MAX_SOLDIERS 1000 #define INF 1000000000 using namespace std; struct Gate { int soldiers; int cost; }; int T, N; Gate gates[MAX_N]; int dp[MAX_N][MAX_N * MAX_SOLDIERS / 2 + 1]; int min(int a, int b) { return (a < b) ? a : b; } int main() { cin >> T; for (int t = 0; t < T; t++) { cin >> N; for (int i = 0; i < N; i++) { cin >> gates[i].soldiers >> gates[i].cost; } for (int i = 0; i <= N; i++) { for (int j = 0; j <= N * MAX_SOLDIERS / 2; j++) { dp[i][j] = INF; } } dp[0][0] = 0; for (int i = 0; i < N; i++) { for (int j = 0; j <= N * MAX_SOLDIERS / 2; j++) { if (dp[i][j] == INF) continue; // Cách 1: Pass dp[i + 1][j] = min(dp[i + 1][j], dp[i][j] + gates[i].cost); // Cách 2: Hire dp[i + 1][j + gates[i].soldiers] = min(dp[i + 1][j + gates[i].soldiers], dp[i][j] + 2 * gates[i].cost); // Cách 3: Battle if (j >= gates[i].soldiers) { dp[i + 1][j - gates[i].soldiers] = min(dp[i + 1][j - gates[i].soldiers], dp[i][j]); } } } int result = INF; for (int j = 0; j <= N * MAX_SOLDIERS / 2; j++) { result = min(result, dp[N][j]); } cout << "#" << t + 1 << " " << result << endl; } return 0; }
Editor is loading...
Leave a Comment