蒜厂幼儿园有 nnn 个小朋友,每个小朋友都有自己想玩的玩具。身为幼儿园园长的你决定给幼儿园买一批玩具,由于经费有限,你只能买 mmm 个玩具。已知玩具商店一共卖 kkk 种玩具,编号为 1,2,3,...k1,2,3,...k1,2,3,...k,你让每个小朋友把想玩的玩具编号都写在了纸上。你希望满足尽可能多的小朋友的需求,请计算出最多能满足多少个小朋友的玩具需求。
输入格式
第一行,输入三个整数 n,m,k(1≤n≤100,1≤m≤k≤15)n,m,k(1 \leq n \leq 100, 1 \leq m \leq k \leq 15)n,m,k(1≤n≤100,1≤m≤k≤15),中间用空格分开。
接下来 nnn 行,第 i+1(0≤i<n)i+1(0 \leq i < n)i+1(0≤i<n) 行的第一个数字 aia_iai 代表第 iii 个小朋友想玩的玩具数量,接下来有 aia_iai 个数字,代表这 aia_iai 个玩具的编号。
输出格式
输出一个整数,表示最多能满足多少小朋友的玩具需求。
样例输入
5 3 5 2 1 4 0 2 3 1 3 2 3 4 2 4 5
样例输出
3
package 计蒜客; import java.util.Scanner; public class 幼儿园买玩具 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan=new Scanner(System.in); int n=scan.nextInt();//孩子的个数 int m=scan.nextInt();//买的玩具个数 int k=scan.nextInt();//商店有的玩具个数 int max=0;//最大满足多少孩子 int[] arr=new int[n]; int[][] arr1=new int[n][k]; int cou=0; for(int i=0;i<n;i++){ arr[i]=scan.nextInt(); for(int j=0;j<arr[i];j++){ arr1[i][scan.nextInt()-1]++; } } outer:for(int i=(int)Math.pow(2, m)-1;i<=Math.pow(2, k)-1;i++){//产生二进制字符串 cou=0; int[][] temp=new int[n][k]; for(int ii=0;ii<n;ii++){ for(int jj=0;jj<k;jj++){ temp[ii][jj]=arr1[ii][jj]; } } String str=Integer.toBinaryString(i); int count=0;//记录1的个数,只能为m for(int ii=0;ii<str.length();ii++){ if(str.charAt(ii)=='1'){ count++; } if(count>m){ continue outer; }//大于m个1跳出 } while(str.length()!=k){ str="0"+str; } for(int ii=0;ii<str.length();ii++){ if(str.charAt(ii)=='1'){ for(int jj=0;jj<n;jj++){ temp[jj][ii]=0;//满足该小朋友的需求,设为0 } } } for(int ii=0;ii<n;ii++){ int flag=0; for(int jj=0;jj<k;jj++){ if(temp[ii][jj]==1){ flag=1; } } if(flag==0){ cou++; } } if(cou>max){ max=cou; } } System.out.println(max); } }