hugo ve nha
user_4230122
c_cpp
a year ago
1.6 kB
13
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