k개의 숫자중 각 사람들이 좋아하는 숫자가 있는지 계산하여야 한다.
#include <bits/stdc++.h>
using namespace std;
int n, d, k, cnt_max = INT_MIN;
vector<int> student[30001];
vector<int> vec_like(16);
int ch[16];
void DFS(int Level, int start) {
if (Level == k) {
int cnt = 0;
for (int i = 1; i <= n; i++) {
bool flag = true;
for (int j = 0; j < student[i].size(); j++) {
int count_n = count(vec_like.begin(), vec_like.end(), student[i][j]);
if (count_n == 0) {
flag = false;
break;
}
}
if (flag == true) {
cnt++;
}
}
cnt_max = max(cnt, cnt_max);
} else {
for (int i = start; i <= d; i++) {
ch[i] = 1;
vec_like[Level] = i;
DFS(i + 1, Level + 1);
ch[i] = 0;
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
freopen("input.txt", "rt", stdin);
cin >> n >> d >> k;
for (int i = 1; i <= n; i++) {
int n_times;
cin >> n_times;
for (int j = 1; j <= n_times; j++) {
int a;
cin >> a;
student[i].push_back(a);
}
}
DFS(0, 1);
cout << cnt_max;
return 0;
}
k개의 숫자중 각 사람들이 좋아하는 숫자가 있는지 따로 계산하지 않는다.
비트마스크를 활용하여 시간복잡도를 줄인다.
#include <bits/stdc++.h>
using namespace std;
int n, d, k, res = INT_MIN;
int student[30001], arr_pow[16];
void DFS(int Level , int start, int bit) {
if(Level == k) {
int cnt = 0;
for (int i=1; i<=n; i++) {
if((student[i] & bit) == student[i]) cnt++;
}
res = max(res, cnt);
}
else {
for (int i=start; i<=d; i++) {
DFS(Level + 1, i + 1, bit + arr_pow[i]);
}
}
}
int main() {
ios_base::sync_with_stdio(false);
freopen("input.txt", "rt", stdin);
cin >> n >> d >> k;
arr_pow[1] = 1;
for (int i = 2; i <= d; i++) arr_pow[i] = arr_pow[i - 1] * 2;
for (int i=1; i<=n; i++) {
int n_times;
cin >> n_times;
for (int j=1; j<=n_times; j++) {
int num;
cin >> num;
student[i] += arr_pow[num];
}
}
DFS(0, 1, 0);
cout << res;
return 0;
}