前往
大廳
主題

LeetCode - 0879. Profitable Schemes 解題心得

Not In My Back Yard | 2024-03-02 12:00:14 | 巴幣 0 | 人氣 51

題目連結:


題目意譯:
現在有一個團體有著 n 位成員,以及一個他們可能會犯下的罪行之列表。第 i 件罪行將會產生出 profit[i] 單位利潤並且需要 group[i] 位成員來參與執行。如果有一位成員參與了某一件罪行,則該成員不得參與另一件罪行。

任何一個由這些罪行所形成的子集合如果將產出至少 minProfit 單位的利潤,則其將被稱為有利可圖的「方案」。而參與該子集合中的罪行之成員總數最多為 n。

回傳可以被選出的「方案」之總數。由於答案可能太大,因此將其模 10 ^ 9 + 7 後再回傳。

限制:
1 ≦ n ≦ 100
0 ≦ minProfit ≦ 100
1 ≦ group.length ≦ 100
1 ≦ group[i] ≦ 100
profit.length == group.length
0 ≦ profit[i] ≦ 100



範例測資:
範例 1:
輸入: n = 5, minProfit = 3, group = [2,2], profit = [2,3]
輸出: 2
解釋: 為了得到至少 3 單位的利潤,該團體可以執行罪行 0 、 1,或是只執行罪行 1。
總計有 2 個方案。

範例 2:
輸入: n = 10, minProfit = 5, group = [2,3,5], profit = [6,7,8]
輸出: 7
解釋: 為了得到至少 3 單位的利潤,該團體可以執行任意罪行,只要至少有執行任何一件即可。
有 7 個可能的方案:(0) 、 (1) 、 (2) 、 (0,1) 、 (0,2) 、 (1,2) 和 (0,1,2)。


解題思維:
可以看到本題為稍微變化的背包問題(Knapsack Problem,參見這題)。

原本的給定的條件是利潤至少 minProfit 且參與成員數不超過 n。而我們可以把這個條件轉換成(一)減去(二),其中:
    (一):參與成員數不超過 n 的方案數。
    (二):參與成員數不超過 n 且利潤 < minProfit 的方案數。
而(一)和(二)可以參見這題的方式求得(一樣是變化版的背包問題)。
(雖然也可以直接算出所有利潤為 minProfit ~ group.length × 100(這個上界是根據題目的條件而得)的方案數,但是會比較浪費記憶體空間)。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作