hugo ve nha

 avatar
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