BOJ 5638 ์๋ฌธ
·209 words·1 min
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/5638 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ๋์ ์๋ฌธ์ด ์๊ณ , ์ ๋๊ณผ ํผํด๋น์ฉ์ด ์๋ ๊ฒ ๊ฐ๋ค. ํผํด๋น์ฉ์ ์ฌ๋ ์๊ฐ์ ๋น๋กํ์ง ์๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ฌ๋ฉด ๊ฐ ์๋ฌธ์ ๋ํด, ์ ๋์ ์๊ฐ์ ๊ณฑํด์ ๊ฐ ์๋ฌธ์ด ๋ฒ๋ฆด ์ ์๋ ๋ฌผ์ ์์ ๊ตฌํ ์ ์๊ณ , ๊ทธ์ ๋ฐ๋ฅธ ๊ฐ๊ฒฉ์ด ๋์จ๋ค. ์ด๊ฑด ๊ทธ๋ฆฌ๋ํ๊ฒ๋ ์กฐ๊ธ ๊ณค๋ํ๊ณ , ๋ฐฐ๋ญ ๋ฌธ์ ๋ก ๋๋? ํ๋๋ฐ, $V$๊ฐ ๋๋ฌด ํฌ๋ค! ๊ทธ๋ฐ๋ฐ ์๋ฌธ์ ๊ฐ์๊ฐ $n \leq 20$์ผ๋ก ์ ์๋ฏธํ๊ฒ ์๋ค. ๊ฐ ํ
์คํธ์ผ์ด์ค์ ๋ํด ๋ชจ๋ ์๋ฌธ์ ์ด์ด๋ณด๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ํํ ์ ์์ ๊ฒ ๊ฐ๋ค. ์๊ฐ๋ณต์ก๋ $O(2^n \cdot nm)$ ์ ๋์ ๋์ํ ๊ฒ ๊ฐ๋ค. ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ int N; cin >> N; vector<pll> door(N); rep(i, 0, N) cin >> door[i].first >> door[i].second; int Q; cin >> Q; rep(q, 1, Q+1){ ll V, T; cin >> V >> T; ll ans = 1e18; rep(bit, 0, 1<<N){ ll wat = 0, cost = 0; rep(i, 0, N) if(bit & (1<<i)) wat += door[i].first*T, cost += door[i].second; if(wat >= V) ans = min(ans, cost); } cout << "Case " << q << ": "; if(ans == 1e18) cout << "IMPOSSIBLE\n"; else cout << ans << '\n'; } } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ