蓝桥杯--幼儿园买玩具

问题描述

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

2 3 1 
3 2 3 4 
2 4 5 
样例输出 
3

 

#include<stdio.h>
#include<vector>
using namespace std;
int main(){
    int n,m,k,d;
    int max=0;
    int a[101][16]={0};
    scanf("%d %d %d",&n,&m,&k);
    for(int i=0;i<n;i++){
        scanf("%d",&d);
        a[i][0]=d;
        for(int j=1;j<=d;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(int i=0;i<(1<<k);i++){
        int tot_1=0;
        int tot=0;
    
        vector<int> v;
        for(int j=0;j<k;j++){
            if(i&(1<<j)){
                tot_1++;
                v.push_back(j+1);
                
            }
        }
        if(tot_1==m){
            for(int b=0;b<n;b++){
            int sum=0;
                    for(int c=1;c<=a[b][0];c++){
                     for(int q=0;q<v.size();q++){
                            if(a[b][c]==v[q]){
                                sum++;
                            }
                        }
                    }
                    if(sum==a[b][0]){
                        tot++;
                    }
                }
            if(max<tot){
                max=tot;
            }
        }
        
        v.clear();
    }
    printf("%d",max);
    return 0;
}

 

posted @ 2018-03-10 19:30  柠檬不酸i  阅读(183)  评论(0编辑  收藏  举报