문제
https://www.acmicpc.net/problem/16508
걸린 시간
00 : 36 : 19
풀이
C++
#include <bits/stdc++.h>
#define INF 1e9
#define all(c) c.begin(), c.end()
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
string T;
cin >> T;
vector<int> need(26, 0);
for(char c : T) need[c-'A']++;
int N;
cin >> N;
vector<vector<int>> alphabet(N, vector<int>(26, 0));
vector<int> C(N);
string W;
for(int i = 0; i < N; i++){
cin >> C[i] >> W;
for(char c : W) alphabet[i][c-'A']++;
}
int ans = INF;
for(int mask = 1; mask < round(pow(2, N)); mask++){
vector<int> temp = need;
int cost = 0;
for(int i = 0; i < N; i++){
if(mask & (int)round(pow(2, i))){
for(int j = 0; j < 26; j++)
temp[j] -= alphabet[i][j];
cost += C[i];
}
}
if(*max_element(all(temp)) <= 0) ans = min(ans, cost);
}
if(ans == INF) cout << -1 << "\n";
else cout << ans << "\n";
return 0;
}
비트마스킹 기법을 이용해 216-1 가지의 경우의 수를 모두 탐색하여 풀이했다.
'Baekjoon' 카테고리의 다른 글
Baekjoon 8682번 Happy monkey (0) | 2021.03.21 |
---|---|
Baekjoon 17087번 숨바꼭질 6 (0) | 2021.03.21 |
Baekjoon 17725번 세훈이의 선물가게 (0) | 2021.01.23 |
Baekjoon 17070번 파이프 옮기기 1 (0) | 2020.12.27 |
Baekjoon 12851번 숨바꼭질 2 (0) | 2020.12.27 |
댓글