幼儿园买玩具(暴力破解)

蒜厂幼儿园有 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(1n100,1mk15),中间用空格分开。

接下来 nnn 行,第 i+1(0≤i<n)i+1(0 \leq i < n)i+1(0i<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);
    }
}

 

转载于:https://www.cnblogs.com/henuLiGang/p/8569448.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值