本文主要是介绍VOJ 幼儿园买玩具 题解 二进制枚举,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
幼儿园买玩具
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n, m, k;cin >> n >> m >> k;vector<vector<int>> v(n + 1);for (int i = 1; i <= n; i++){int num; // 该小朋友想玩的玩具数量cin >> num;int temp; // 玩具编号for (int j = 0; j < num; j++){cin >> temp;v[i].push_back(temp);}}if (m >= k){cout << n;return 0;}int ans = 0;for (int i = 0; i < (1 << k); ++i) // 二进制枚举所有玩具选择情况{int is[16] = {0}; // 记录该二进制状态下选择的玩具编号int cnt = 0; // 该二进制状态下选择买的玩具的数量for (int j = 0; j < k; j++){if (i & (1 << j))is[j + 1] = 1, cnt++;}if (cnt == m) // 根据贪心,尽可能多的买玩具能满足更多小朋友的需求,所以只需考虑cnt==m的情况{int temp = 0; // 当前选择方案能满足小朋友需求的数量for (int k = 1; k <= n; k++){bool ok = 1; // 判断是否满足该小朋友的需求int num = v[k].size();for (int s = 0; s < num; s++){if (is[v[k][s]] == 0){ok = 0;break;}}if (ok)temp++;}ans = max(temp, ans); // 维护ans为最大值}}cout << ans;return 0;
}
这篇关于VOJ 幼儿园买玩具 题解 二进制枚举的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!