幼兒園分糖果

2021-10-03 02:55:29 字數 1740 閱讀 3689

09 幼兒園分糖果

描述​ 新年將至,幼兒園的老師們為小朋友們準備了各種各樣的糖果。不同的小朋友所喜歡的糖果可能是不同的,為了讓更多的小朋友得到他/她喜愛的糖果,幼兒園的老師們對小朋友們的「糖果偏好」(即哪位小朋友喜歡哪幾種糖果)進行了統計。

現已知老師們共準備了f(1 ≤ f ≤ 20)種糖果,準備為幼兒園裡的n位小朋友(1≤ n ≤20)分配糖果。同上所述,我們假設:

(1)每位小朋友只會接受自己喜歡的糖果,不接受自己不喜歡的糖果;

(2)每種糖果只能分給某一位小朋友(即:一旦某種糖果分給某位小朋友,則其他小朋友就不能再被分配到該種糖果);

(3)我們不保證所有小朋友都能獲得糖果;

(4)每個小朋友喜歡哪種糖果將在輸入資料中給出。

請你構造乙個程式,幫助老師們分配糖果,以使得在上述條件下,老師們能夠將現有糖果分配給最多的小朋友。請輸出可分到糖果的小朋友的最多的人數。

關於輸入

​ 第1行為兩個整數:n 和 f,以空格隔開。其中,n(1≤ n ≤20)表示小朋友的總人數;f(1 ≤ f ≤ 20)表示糖果的總種數(糖果種類分別用整數1,2,3,…,f進行編號)。

​ 接下來有n行,每行包含多個以空格隔開的整數;其中,第乙個整數m,表示某位小朋友所喜愛的糖果的種數,其後的m個整數,表示該小朋友所喜愛的糖果種類的編號序列。

​ 例如:若某行的輸入為「3 1 2 3」,則表示該位小朋友共喜歡3種型別的糖果,其糖果型別編號分別為「1」「2」「3」。

關於輸出

僅一行,即在上述輸入條件下,能分到糖果的小朋友的人數的最大值。

例子輸入

4 3

2 1 2

2 2 3

2 1 3

2 1 3

例子輸出
3
分析

​ 原理上,這個題我們仍然使用遞迴來遍歷所有可能的情況,求出對應的糖果分法。但是與之前不同的是,之前的問題保證所有的東西都是一一對應的,每個人都會分到對應的東西。而本題則會有人不能得到東西,這就是本題的特殊之處,在最後一行有所體現

​ 在遞迴的出口方面本題需要特別注意,由於可能有人得不到糖果,所以遞迴出口是「對第n個人完成了糖果的分配」,並且遞迴的遞推過程也要體現「可能這個人分不到糖果」這一事實

**實現

#include

#include

using

namespace std;

int f, n;

bool like[22]

[22]=

;//like[people][candy]=true 表示喜歡

bool used[22]

=;//糖果有沒有被分給其他人

int max_devide =

0, temp_count =0;

intmain()

}void

devide

(int people)

;devide(1

);//給第乙個人分

cout << max_devide;

return0;

}void

devide

(int people)}if

(!flag)

devide

(people +1)

;//這是不把任何candy分給people的情況,之前按不考慮這個是因為之前的題目物品與人是一一對應的,如八皇后,現在可以允許有人不拿到任何東西,這裡考慮的就是這種情況

}

幼兒園分班

幼兒園乙個大班要分成兩個小班,有些小朋友不希望自己和其他某幾位小朋友同班。園長向大家收集了不希望同班的要求,然後視情況將乙個大班的小朋友分成兩個班。請你開發乙個程式,幫助園長快速判斷是否所有小朋友的不同班請求都可以被滿足。輸入描述 輸入分為三部分,第乙個部分是乙個 int,代表這個大班裡小朋友的總數...

幼兒園買玩具

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

幼兒園買玩具

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