演算法學習之路|幼兒園買玩具
題目大意:
蒜廠幼兒園有 nn 個小朋友,每個小朋友都有自己想玩的玩具。身為幼兒園園長的你決定給幼兒園買一批玩具,由於經費有限,你只能買 mm 個玩具。已知玩具商店一共賣 kk 種玩具,編號為 1,2,3,…k1,2,3,…k,你讓每個小朋友把想玩的玩具編號都寫在了紙上。你希望滿足儘可能多的小朋友的需求,請計算出最多能滿足多少個小朋友的玩具需求。
輸入格式
第一行,輸入三個整數 n,m,k(1≤n≤100,1≤m≤k≤15)n,m,k(1≤n≤100,1≤m≤k≤15),中間用空格分開。
接下來 nn 行,第 i+1(0≤i
輸出格式
輸出一個整數,表示最多能滿足多少小朋友的玩具需求。
樣例輸入
5 3 5
2 1 4
0
2 3 1
3 2 3 4
2 4 5
樣例輸出
3
具體思路:
我們可以列舉n,列舉出滿足最多孩子時,哪些孩子滿足了。可是n的範圍過於龐大,我們改變思路。
列舉所有種你可能取的玩具種類,每一種都求出可以滿足多少孩子,選擇能滿足孩子數最多的。
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
int main(){
int n,m,k;
cin>>n>>m>>k;
int a[100][16];//a[n][0]存每個人需要玩具的種類個數,a[n][1~15]存編號
for(int i=0;i<n;i++){
cin>>a[i][0];
for(int j=1;j<=a[i][0];j++)
cin>>a[i][j];
}
//以上錄入
int MAX=0;
for(int i=1;i<(1<<k);i++){//因為範圍n>>k,我們列舉k
set<int> v;//列舉滿足最大人數時,玩具的所有種類
for(int j=0;j<k;j++){//搜尋二進位制k位
if(i&(1<<j))
v.insert(j+1);
}
if(v.size()>m) continue;//如果k的種類大於我們的m,跳過
int num=0;//存列舉的每一種滿足的最大人數
for(int j=0;j<n;j++){
int flag=0;
for(int k=1;k<=a[j][0];k++){
if(v.find(a[j][k])==v.end()){
//如果孩子所需的不在此種中,這個孩子我們滿足不了,flag=1,不加入總和
flag=1;
break;
}
}
if(flag==0)//說明該孩子的滿足我們這種玩具剛好滿足,加入總和
num++;
}
MAX=max(MAX, num);//求列舉所有玩具中,滿足最大孩子數人數
}
cout<<MAX;
}
相關文章
- 演算法學習之路|划拳演算法
- 演算法學習之路|A除以B演算法
- 演算法學習之路|列印排名演算法
- 演算法學習之路|方格分割演算法
- 演算法學習之路|朋友數演算法
- 演算法學習之路|SpellItRight演算法
- 演算法學習之路|歐幾里得遊戲演算法遊戲
- 演算法學習之路|月餅演算法
- 演算法學習之路|PATRanking演算法
- 演算法學習之路|列印沙漏演算法
- 演算法學習之路|快速排序演算法排序
- 演算法學習之路|結繩演算法
- 演算法學習之路|數零壹演算法
- 演算法學習之路|開學寄語演算法
- 演算法學習之路|說反話演算法
- 演算法學習之路|小賭怡情演算法
- 演算法學習之路|影像過濾演算法
- 演算法學習之路|日期問題演算法
- 演算法學習之路|賣個萌演算法
- 演算法學習之路|螺旋矩陣演算法矩陣
- 演算法學習之路|選擇題演算法
- 演算法學習之路|字元統計演算法字元
- 演算法學習之路|科學計數法演算法
- 演算法學習之路|PlayOnWords(尤拉道路+dfs)演算法
- 演算法學習之路|舊鍵盤打字演算法
- 演算法學習之路|最簡分數演算法
- 演算法學習之路|檢驗身份證演算法
- 演算法學習之路|愛丁頓數演算法
- 演算法學習之路|最小生成樹——prime演算法演算法
- 強化學習之路一 QLearning 演算法強化學習演算法
- 演算法學習之路|個位數統計演算法
- 演算法學習之路|狀態壓縮dp演算法
- 演算法學習之路|棋盤問題(博弈)演算法
- 演算法學習之路|進位制轉換演算法
- 演算法學習之路|宇宙無敵加法器演算法
- 演算法學習之路|四平方和演算法
- 演算法學習之路|寫出這個數(20)演算法
- 演算法學習之路|強連通分量+縮點演算法