計蒜客幼兒園買玩具 二進位制列舉子集

2022-09-01 15:24:16 字數 2018 閱讀 9524

問題描述

蒜廠幼兒園有 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思路:

分析給出的案列,發現第 2 個小朋友不需要玩具,第 1 個小朋友需要1、4號玩具 與 第 5 個小朋友需要4、5號玩具,此時院長最多購買3個玩具,因此院長只需購買1、4、5號玩具,最終能滿足1、2、5個孩子共3個孩子的要求。

考慮用二進位制列舉來解決此題,用乙個陣列 num 來存放每個孩子想要的玩具,比如說第乙個孩子需要兩個玩具,1和4,此時num[0]=1001(從低位開始記錄),第二個孩子不需要玩具,此時num[1]=0,依次類推,5個孩子想要的玩具情況為:

num[0]=1001,1、4號玩具

num[1]=0,不需要玩具

num[2]=   101,1、3號玩具

num[3]=  1110      ,2、3、4號玩具

num[4]=11000,4、5號玩具

把孩子相應想要的玩具情況存入num陣列

for(int i = 0;i < n;++ i) 

num[i] = tmp;

}

為num陣列賦好值後,便決定購買哪幾種玩具:

for(int i = 0;i < (1 << k);++ i) 

if(count > m) continue;//玩具數量超過m種了

int tmp = 0;

for(int j = 0;j < n;++ j)

res = max(res, tmp);//保留最多滿足幾個小朋友的結果

}

第一重迴圈:for(int i = 0;i < (1 << k);++ i),i 的值可以從 0 取到  2^4-1,當 i = 11001(對應為院長購買1、4、5號玩具) 時,可以發現 11001 | num[0] == 11001 ,11001 | num[1] == 11001 , 11001 | num[4] == 11001。 

**:

#include #include 

using

namespace

std;

const

int kmax = 100 + 10

;int

num[kmax];

intmain()

num[i] =tmp;

}for(int i = 0;i < (1

<< k);++ i)

if(count > m) continue;//

玩具數量超過m種了

int tmp = 0

;

for(int j = 0;j < n;++j)

res = max(res, tmp);//

保留最多滿足幾個小朋友的結果

} printf(

"%d\n

", res);

return0;

}

二進位制列舉 計蒜客幼兒園買玩具

幼兒園有n 個小朋友,每個小朋友都有自己想玩的玩具。身為幼兒園園長的你決定給幼兒園買一批玩具,由於經費有限,你只能買 m m 個玩具。已知玩具商店一共賣 k k 種玩具,編號為 1,2,3,k1,2,3,k 你讓每個小朋友把想玩的玩具編號都寫在了紙上。你希望滿足盡可能多的小朋友的需求,請計算出最多能...

二進位制列舉 幼兒園買玩具

問題描述 蒜廠幼兒園有n 個小朋友,每個小朋友都有自己想玩的玩具。身為幼兒園園長的你決定給幼兒園買一批玩具,由於經費有限,你只能買m 個玩具。已知玩具商店一共賣k種玩具,編號為1,2,3,k,你讓每個小朋友把想玩的玩具編號都寫在了紙上。你希望滿足盡可能多的小朋友的需求,請計算出最多能滿足多少個小朋友...

幼兒園買玩具 二進位制列舉

幼兒園買玩具 蒜廠幼兒園有 nn 個小朋友,每個小朋友都有自己想玩的玩具。身為幼兒園園長的你決定給幼兒園買一批玩具,由於經費有限,你只能買 mm 個玩具。已知玩具商店一共賣 kk 種玩具,編號為 1,2,3,k1,2,3,k,你讓每個小朋友把想玩的玩具編號都寫在了紙上。你希望滿足盡可能多的小朋友的需...