-
[1102] 발전소BOJ 2021. 10. 27. 20:22
https://www.acmicpc.net/problem/1102
1102번: 발전소
첫째 줄에 발전소의 개수 N이 주어진다. N은 16보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 발전소 i를 이용해서 발전소 j를 재시작할 때 드는 비용이 주어진다. i줄의 j번째 값이 그
www.acmicpc.net
<문제>
외판원순회랑 비슷하게 완전탐색해주면 된다.
어떤 발전소를 켰는지를 비트마스킹으로 표현해주었다.
<소스코드>
123456789101112131415161718192021222324252627282930313233343536373839#include <bits/stdc++.h>using namespace std;const int INF = 54321;int n, p, ans = INF, a[17][17], dp[1 << 16];int f(int cnt, int bt) {if (cnt >= p) return 0;if (dp[bt] != -1) return dp[bt];dp[bt] = INF;int i, j;for (i = 0; i < n; i++) {if (bt & (1 << i)) continue;for (j = 0; j < n; j++)if (bt & (1 << j))dp[bt] = min(f(cnt + 1, bt | (1 << i)) + a[j][i], dp[bt]);}return dp[bt];}int main(void) {memset(dp, -1, sizeof(dp));int i, j;cin >> n;for (i = 0; i < n; i++)for (j = 0; j < n; j++) cin >> a[i][j];string s;cin >> s;int bt = 0, S = s.length(), cnt = 0;for (i = 0; i < S; i++)if (s[i] == 'Y') {bt |= (1 << i);cnt++;}cin >> p;int ret = f(cnt, bt);if (ret == INF)cout << "-1";elsecout << ret;return 0;}cs 'BOJ' 카테고리의 다른 글
[1285] 동전 뒤집기 (0) 2021.10.28 [1562] 계단 수 (0) 2021.10.27 [3056] 007 (0) 2021.10.27 [1480] 보석 모으기 (0) 2021.10.25 [17244] 아맞다우산 (0) 2021.10.25