C++题解:幼儿园买玩具

目录

 

题目

题解 


懂了的话就点个赞哦~没懂就看到懂为止呗~

题目

蒜厂幼儿园有 n 个小朋友,每个小朋友都有自己想玩的玩具。身为幼儿园园长的你决定给幼儿园买一批玩具,由于经费有限,你只能买 m 个玩具。已知玩具商店一共卖 k 种玩具,编号为 1,2,3,...k,你让每个小朋友把想玩的玩具编号都写在了纸上。你希望满足尽可能多的小朋友的需求,请计算出最多同时能满足多少个小朋友的玩具需求。

输入格式

第一行,输入三个整数 n,m,k(1≤n≤100,1≤m≤k≤15),中间用空格分开。

接下来 n 行,第 i+1(0≤i<n) 行的第一个数字 a_i 代表第 i 个小朋友想玩的玩具数量,接下来有 a_i​ 个数字,代表这 a_i​ 个玩具的编号。

输出格式

输出一个整数,表示最多能满足多少小朋友的玩具需求。

输出时每行末尾的多余空格,不影响答案正确性

样例输入

5 3 5
2 1 4
0
2 3 1
3 2 3 4
2 4 5

样例输出

3

题解 

我们可用二进制枚举子集的方法来做此题。

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int NOI=1e2;
int ans;//记录答案
int a[1<<16];//定义二进制数组
int main(){
    int n,m,k;//n 个小朋友;只能买 m 个玩具;商店一共卖 k 种玩具
    cin>>n>>m>>k;
    for (int i=0,tp;i<n;i++){
        cin>>tp;
        if (tp!=0){
            for (int j=0,tmp;j<tp;j++){
                cin>>tmp;//第一个数字 a代表第 i 个小朋友想玩的玩具数量,
                a[i]|=(1<<(tmp-1));//用二进制来表达出某个娃子要的玩具
            }//接下来有 a个数字,代表这 a个玩具的编号。
        }
    }
    for (int i=0;i<(1<<k);i++){//二进制枚举子集
        int sum=0;//当前能满足的人的数量
        bool t=0;
        for (int j=0;j<k;j++){
            if (i&(1<<j)){//看选没选中
                sum++;
            }
            if (sum>m){
                t=1;
                break;
            }
        }
        if (t)continue;//判断钱够不够
        sum=0;
        for (int j=0;j<n;j++){
            if ((a[j]&i)==a[j]){//求出目前最多能满足多少小朋友的玩具需求
                sum++;
            }
        }
        ans=max(ans,sum);
    }
    cout<<ans<<endl;//输出答案
    return 0;
}

懂了的话就点个赞哦~没懂就看到懂为止呗~

猜你喜欢

转载自blog.csdn.net/Keven_11/article/details/107813555
今日推荐