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,你讓每個小朋友把想玩的玩具編號都寫在了紙上。你希望滿足盡可能多的小朋友的需求,請計算出最多同時能滿...