问题描述 蒜厂幼儿园有 n 个小朋友,每个小朋友都有自己想玩的玩具。身为幼儿园园长的你决定给幼儿园买一批玩具,由于经费有限,你只能买 m 个玩具。已知玩具商店一共卖 k 种玩具,编号为 1,2,3,…k,你让每个小朋友把想玩的玩具编号都写在了纸上。你希望满足尽可能多的小朋友的需求,请计算出最多同时能满足多少个小朋友的玩具需求。 输入格式 第一行,输入三个整数 n,m,k(1≤n≤100,1≤m≤k≤15),中间用空格分开。 接下来 n 行,第 i+1(0≤i< n) 行的第一个数字 ai代表第 i 个小朋友想玩的玩具数量,接下来有 ai个数字,代表这 ai 个玩具的编号。 输出格式 输出一个整数,表示最多能满足多少小朋友的玩具需求。
样例输入 5 3 5 2 1 4 0 2 3 1 3 2 3 4 2 4 5 样例输出 3 #include <bits/stdc++.h> using namespace std; int main() { int n, m, k, a[100][15] = {0}, b[100], c[16] = {0}, t = 0, i, j, d[16], max = 0; scanf("%d%d%d", &n, &m, &k); for (i = 0; i < n; i++) { scanf("%d", &b[i]); for (j = 0; j < b[i]; j++) { scanf("%d", &a[i][j]); if (c[a[i][j]] == 0) { c[a[i][j]] = 1; d[t] = a[i][j]; t++; } } } int N = (int) pow(2, t); for (i = 0; i < N; i++) { j = i; int h = 0, o = 0; while (j != 0) { if (j % 2) { c[o] = d[h]; o++; } h++; j = j / 2; } if (o <= m) { int sum = 0; for (int p = 0; p < n; p++) { int u = 1; for (int q = 0; q < b[p]; q++) { int x = 1; for (int r = 0; r < o; r++) if (c[r] == a[p][q]) { x = 0; break; } if (x) { u = 0; break; } } if (u) sum++; } if (sum > max) max = sum; } } printf("%d", max); return 0; }