※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 24954번 문제인 물약 구매이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/24954 

 

24954번: 물약 구매

동전 10개를 지불하고 1번 물약을 구매하면, 3번 물약이 동전 10개만큼 할인되어 값이 동전 10개가 된다. 2번 물약은 동전 20개만큼 할인되어야 하지만, 최소 1개는 지불해야 하므로 값이 동전 1개가

www.acmicpc.net

물약을 사는 순서 10!가지 전체를 완전탐색해보자.

 

글쓴이는 이 문제에서는 충분한 시간여유가 있을 것이라 생각해 각 탐색단계에서의 현재 물약가격 정보를 벡터에 담아 다음 탐색단계에 복사해 넘겨주었다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <vector>
using namespace std;

int N;
int ans = 1000000007;
vector<pair<int,int>> discount[10];

void func(vector<int> vec, int total, int cnt) {
	if (cnt == N) {
		ans = min(ans, total);
		return;
	}
	cnt++;
	for (int i = 0; i < N; i++) {
		if (vec[i] > 0) {
			auto tmp = vec;
			tmp[i] = 0;
			for (auto p : discount[i]) {
				if (tmp[p.first] > 0) {
					tmp[p.first] = max(1, tmp[p.first] - p.second);
				}
			}
			func(tmp, total + vec[i], cnt);
		}
	}
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N;
	vector<int> price(N);
	for (int i = 0; i < N; i++) cin >> price[i];

	for (int i = 0; i < N; i++) {
		int Q; cin >> Q;
		while (Q--) {
			int x, y; cin >> x >> y;
			discount[i].emplace_back(make_pair(x - 1, y));
		}
	}

	func(price, 0, 0);

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 15240 // C++] Paint bucket  (0) 2022.07.10
[BOJ 1600 // C++] 말이 되고픈 원숭이  (0) 2022.07.10
[BOJ 15241 // C++] Counting paths  (0) 2022.07.10
[BOJ 24725 // C++] 엠비티아이  (0) 2022.07.10
[BOJ 15233 // C++] Final Score  (0) 2022.07.10

+ Recent posts