※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 26937번 문제인 Köpa Böcker이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/26937
26937번: Köpa Böcker
Första raden innehåller två tal: $N$, antalet böcker du ska köpa $(1 \le N \le 100$), och $M$, antalet bokhandlar $(1 \le M \le 15)$. Därefter följer en rad med två tal som anger antalet böcker $K$ (av de eftersökta) som finns i första bokhandel
www.acmicpc.net
M이 최대 15까지이므로, 물건을 살 서점을 고를 경우의 수는 많아야 2^15가지가 된다.
위의 각 경우에 대하여 골라진 서점 중 각 책의 값의 최솟값들의 합(살 수 없다면 가상의 무한대값)을 더해 각 제한 하에서의 답을 구하자. 이 값들 중 최솟값이 문제의 답이 됨을 이용해 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
using namespace std;
vector<int> mn[100];
int arr[15][100]; // [i][j]: i번 서점의 책 j의 값
int p[15];
int N, M;
int sum_p;
int ans = 2000000007;
void func(int cur) {
if (cur == M) {
int val = sum_p;
for (int n = 0; n < N; n++) {
val += mn[n].back();
}
ans = min(ans, val);
return;
}
func(cur + 1);
sum_p += p[cur];
for (int n = 0; n < N; n++) {
if (mn[n].back() >= arr[cur][n]) mn[n].emplace_back(arr[cur][n]);
}
func(cur + 1);
for (int n = 0; n < N; n++) {
if (mn[n].back() == arr[cur][n]) mn[n].pop_back();
}
sum_p -= p[cur];
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M;
for (int n = 0; n < N; n++) {
mn[n].emplace_back(10000007);
for (int m = 0; m < M; m++) arr[m][n] = 1000000007;
}
for (int m = 0; m < M; m++) {
int K; cin >> K >> p[m];
while (K--) {
int x, y; cin >> x >> y; x--;
if (y < arr[m][x]) arr[m][x] = y;
}
}
func(0);
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 1334 // C++] 다음 팰린드롬 수 (0) | 2023.07.30 |
---|---|
[BOJ 1323 // C++] 숫자 연결하기 (0) | 2023.07.29 |
[BOJ 26763 // C++] Liczby silne (0) | 2023.07.27 |
[BOJ 26748 // C++] Antypalindrom (0) | 2023.07.26 |
[BOJ 2295 // C++] 세 수의 합 (0) | 2023.07.25 |