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

 

이번에 볼 문제는 백준 16508번 문제인 전공책이다.
문제는 아래 링크를 확인하자.

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

 

전공책의 개수 \(N\)이 16 이하임을 확인하자. 즉 전공책을 고르는 경우의 수는 \(2^N\), 즉 65536가지로 충분히 적음을 알 수 있다.

 

따라서 각각의 모든 전공책을 고르는 경우의 수를 방문해 (1) 원하는 문자열을 만들 수 있는지 확인하고 (2) 만들 수 있는 경우들의 전공책 가격의 합의 최솟값을 구해 문제를 해결할 수 있다.

 

글쓴이는 고른 책들의 이름에 포함된 각 문자들의 수를 관리해 원하는 문자열의 각 문자의 수와 비교하는 방식으로 (1) 과정을 구현하였다.

 

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

#include <iostream>
using namespace std;

string s;
int N;
int C[16]; string ss[16];
int X[128];
int cnt[128], total;
int ans = 1000000007;
void func(int idx) {
	if (idx == N) {
		bool chk = 1;
		for (char c = 'A'; c <= 'Z'; c++) {
			if (cnt[c] < X[c]) {
				chk = 0;
				break;
			}
		}
		if (chk) ans = min(ans, total);
		return;
	}
	func(idx + 1);
	for (auto &l:ss[idx]) cnt[l]++;
	total += C[idx];
	func(idx + 1);
	total -= C[idx];
	for (auto &l:ss[idx]) cnt[l]--;
}

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

	cin >> s;
	for (auto &l:s) X[l]++;
	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> C[i] >> ss[i];
	}

	func(0);
	if (ans < 1000000007) cout << ans;
	else cout << -1;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 24731 // C++] XOR-ABC  (0) 2024.05.19
[BOJ 30679 // C++] 별 가두기  (0) 2024.05.18
[BOJ 22662 // C++] Pi is Three  (0) 2024.05.16
[BOJ 11690 // C++] LCM(1, 2, ..., n)  (0) 2024.05.15
[BOJ 19592 // C++] 장난감 경주  (0) 2024.05.14

+ Recent posts