幼儿园买玩具

问题描述
蒜厂幼儿园有 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 <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
int main() 
{ 
  int m, n, k,maxn;     //定义m,n,k ,答案maxn 
  cin >> n >> m >> k;   //输入 
  maxn=-99999;          //初始化 
  vector<int>toy[n + 10];   //记录每个kid要的toy 
  for (int i = 0; i < n; i++) {
    int num;
    cin>>num;
    for(int p=0;p<num;p++)
    {   int a;
        cin>>a;
        toy[i].push_back(a);
    }                       //输入玩具 
 }
 for(int i=0;i<(1<<k);i++)  //枚举玩具 
    {   int er=0;           //判断是否买多了 
        int cnt=0;          //记录当前满足孩子数 
        int ability[k+10];  //满足的为1 
        memset(ability,0,sizeof(ability)); 
        int lim=0;
        for(int tm=0;tm<k;tm++)
        {
            if(i&(1<<tm))
            {
            lim++;          
            }
            if(lim>m)er=1;
        }
        if(er==1) continue;
        for(int tm=0;tm<k;tm++)
        {
            if(i&(1<<tm))
            {
            ability[k-tm-1]=1;          
            }
        }
        for(int kid=0;kid<n;kid++)
        {   int ok=1;
            for(int t=0;t<toy[kid].size();t++)
            {
                if(ability[toy[kid][t]-1]==0)ok=0;
            }
            if(ok==1)cnt++;
        }
    maxn=max(maxn,cnt);
    }
    cout<<maxn;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42403069/article/details/86524480