問題描述
蒜廠幼兒園有 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 #includeusing
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,你讓每個小朋友把想玩的玩具編號都寫在了紙上。你希望滿足盡可能多的小朋友的需...