当前位置 博文首页 > Keven_11的博客:C++题解:幼儿园买玩具

    Keven_11的博客:C++题解:幼儿园买玩具

    作者:[db:作者] 时间:2021-08-30 22:23

    目录

    ?

    题目

    题解?


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

    题目

    蒜厂幼儿园有?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;
    }

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

    cs