hugo ve nha
user_4230122
c_cpp
a year ago
1.6 kB
8
Indexable
#include <iostream> using namespace std; int t, n; struct node { int num_linh, cost; }; int status[2][22]; node door[21]; int min1; int battle[3]; void backTrack(int stt_door, int cost, int linh0, int linh1, int linh2) { //dk dung if (cost > min1) return; if (stt_door == n + 1) { if (min1 > cost) { min1 = cost; } return; } for (int i = 0; i < 3; i++) { //th pass if (i == 0) { backTrack(stt_door + 1, cost + door[stt_door].cost, linh0, linh1, linh2); } //th hire if (i == 1) { backTrack(stt_door + 1, cost + 2 * door[stt_door].cost, linh0 + door[stt_door].num_linh, linh1, linh2); } //th battle if (i == 2) { if (linh0 + linh1 + linh2 < door[stt_door].num_linh) return; else { if (linh2 >= door[stt_door].num_linh) { backTrack(stt_door + 1, cost, 0, linh0, linh1); } else if (linh1 + linh2 >= door[stt_door].num_linh) { backTrack(stt_door + 1, cost, 0, linh0, linh1 + linh2 - door[stt_door].num_linh); } else if (linh0 + linh1 + linh2 >= door[stt_door].num_linh) { backTrack(stt_door + 1, cost, 0, linh0 + linh1 + linh2 - door[stt_door].num_linh,0); } } } } } int main() { cin >> t; for (int tc = 0; tc < t; tc++) { cin >> n; for (int i = 1; i <= n; i++) { status[0][i] = status[1][i] = 0; } for (int i = 1; i <= n; i++) { cin >> door[i].num_linh >> door[i].cost; } min1 = 1000000; for (int i = 0; i < 3; i++) { battle[i] = 0; } backTrack(1,0, battle[0], battle[1], battle[2]); cout << "#" << tc + 1 << " " << min1 << endl; } return 0; }
Editor is loading...
Leave a Comment