๐ค๋ฌธ์ ์ดํด
๊ฐ ํ์คํธ๋น ํ์ํ ์คํฌ์ ๋ค ์ฌ์ฉ๊ฐ๋ฅํ ๋ ๊ทธ ํ์คํธ๋ฅผ ๊นฐ ์ ์๋ค. 2n๊ฐ์ ์คํฌ ์ค n๊ฐ๋ง ๊ณจ๋์ ๋ ์ต๋๋ก ๋ง์ด ๊นฐ ์ ์๋ ํ์คํธ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
์กฐ๊ฑด
ํค์ ๊ฐ์ : n
ํ์คํธ์ ๊ฐ์ : m (1 ~ 100)
ํ์คํธ ๋น ์คํฌ ์ : k (1 ~ n)
์คํฌ์ ๋ฒํธ ( 1~2n)
๐ฅํ์ด๐ฅ
2n๊ฐ์ ์คํฌ ์ค ๋ฐฐ์นํ ์คํฌ n๊ฐ๋ฅผ ๊ณจ๋์ ๋ ๊นฐ ์ ์๋ ํ์คํธ์ ๊ฐ์ ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ ์ถ๋ ฅํ๊ฒ ํ๋ค.
๋ณ์
- quest[i] : i๋ฒ์งธ ํ์คํธ์์ ํ์ํ ์คํฌ์ ๋ฒํธ๋ฅผ ๋นํธ๋ก ํํ
์ฌ๊ทํจ์ void Solve(int i, int d, int cnt)
- ํ์ฌ ์ํ : ํ์ฌ๊น์ง ์ ํ ์คํฌ์ ๋นํธ๋ก ๋ํ๋ด๋ i, ๋ช๋ฒ์งธ ์คํฌ๊น์ง ์ฒ๋ฆฌํด์คฌ๋์ง๋ฅผ ๋ํ๋ด๋ d, ์ ํ ์คํฌ์ ๊ฐ์ cnt
- ๋ค์ ์ํ : d๋ฒ ์คํฌ์ ์ฌ์ฉ or d๋ฒ ์คํฌ์ ์ฌ์ฉํ์ง ์์
- ์ง์ ์ํ : ์๋ฌด๊ฒ๋ ์ ํ์ง ์์ ์ํ์ด๊ณ 1๋ฒ ์คํฌ๋ถํฐ ๊ณจ๋ผ์ผ ํ๋ฏ๋ก Solve(0, 1, 0)
- ์ข ๋ฃ ์ํ : cnt๊ฐ n์ผ ๋, ์ฆ n๊ฐ์ ์คํฌ์ ๊ณจ๋์ ๋ return
- d๋ฒ ์คํฌ์ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด i์ ํด๋น ์คํฌ ๋ฒํธ์ ๋นํธ๋ฅผ ์ผ์ค(1๋ก ๋ง๋ค์ด์ค๋ค)
ํจ์ void CountQuest(int x)
- ๊ฐ ํ์คํธ์์ ํ์ํ ์คํฌ์ ์ ๋ณด์ ์ ํ n๊ฐ์ ์คํฌ์ AND ์ฐ์ฐํ ๊ฐ์ด ํ์ํ ์คํฌ์ ์ ๋ณด์ ์ผ์นํ๋ค๋ฉด ๊นฐ ์ ์๋ ํ์คํธ์ ์๋ฅผ +1
- ๋ชจ๋ ํ์คํธ์ ๋น๊ต ํ ์ถ๋ ฅํ ๋ณ์ ans์ ๋น๊ตํด ๋ ํฐ ๊ฐ์ ans์ ์ ์ฅ
โ๏ธ ํ๊ธฐ
๋ฌธ์ ์ ์ ๋ ฅ์ด ์ด๋ป๊ฒ ๋ค์ด์ค๋์ง ์ ๋๋ก ํ์ธํ์ง ์์์ 3๋ฒ์ด๋ ํ๋ ธ๋ค.
#include <iostream>
#include <vector>
using namespace std;
int n, m, k, a;
int quest[102];
int ans;
void CountQuest(int x) {
int cnt = 0;
for (int i = 0; i < m; i++) {
if ((quest[i] & x) == quest[i]) {
cnt++;
}
}
ans = max(ans, cnt);
}
void Solve(int i, int d, int cnt) {
if (cnt == n) {
CountQuest(i);
return;
} else if (d == 2 * n + 1) return;
else {
Solve(i, d + 1, cnt);
i = i | (1 << d);
Solve(i, d + 1, cnt + 1);
}
}
int main() {
cin.tie(nullptr);
cout.tie(nullptr);
ios::sync_with_stdio(false);
cin >> n >> m >> k;
for (int i = 0; i < m; i++) {
for (int j = 0; j < k; j++) {
cin >> a;
quest[i] = quest[i] | (1 << a);
}
}
Solve(0, 1, 0);
cout << ans;
}
'๋ฐฑ์ค > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/C++] 24524๋ฒ ์๋ฆ๋ค์ด ๋ฌธ์์ด (0) | 2022.10.05 |
---|---|
[๋ฐฑ์ค/C++] 9663๋ฒ N-Queen (0) | 2022.08.16 |
[๋ฐฑ์ค/C++] 2239๋ฒ ์ค๋์ฟ (0) | 2022.08.11 |
[๋ฐฑ์ค/C++] 1043๋ฒ ๊ฑฐ์ง๋ง (0) | 2022.07.26 |
[๋ฐฑ์ค/C++] 17143๋ฒ ๋์์ (0) | 2022.07.26 |