演算法提高 貪吃的大嘴

2021-10-18 16:20:40 字數 1583 閱讀 4337

問題描述

有乙隻特別貪吃的大嘴,她很喜歡吃一種小蛋糕,而每乙個小蛋糕有乙個美味度,而大嘴是很傲嬌的,一定要吃美味度和剛好為m的小蛋糕,而且大嘴還特別懶,她希望通過吃數量最少的小蛋糕達到這個目的.所以她希望你能設計乙個程式幫她決定要吃哪些小蛋糕.

輸入格式

先輸入一行包含2個整數m、n,表示大嘴需要吃美味度和為m的小蛋糕,而小蛋糕一共有n種,下面輸入n行,每行2個整數,第乙個表示該種小蛋糕的美味度,第二個表示蛋糕店中該種小蛋糕的總數

輸出格式

輸出一行包含乙個整數表示大嘴最少需要吃的小蛋糕數量,若大嘴無法通過吃小蛋糕達到m的美味度和,則輸出"><「.

樣例輸入

10 2

4 12 10

樣例輸出

4樣例輸入

10 2

4 17 3

樣例輸出

><

資料規模和約定

m ≤ 20000,小蛋糕總數量≤50.

思路:

此題一看就知道是乙個多重揹包題,只不過我們要求吃的小蛋糕數量。我們知道多重揹包就是可以選物品n個,我們首先把01揹包的程式的for迴圈寫出來。然後在考慮多重的for如何寫。

我們知道當物品i選擇一次後就會選擇下個物品了,那我們可以選在原來的基礎上嵌入乙個for用來表示當前選擇了i物品的次數,由此我們dp[j]就等於dp[j-k*a[i][0]]+k和dp[j]相互比較了。dp[j]表示當前我j的美味度時最少需要吃的小蛋糕數量。我們要去他們的最小值所以我們的初始化要盡可能的大,dp[0]=0乙個邊界值。

程式:

m,n=

map(

int,

input()

.split())

dp=[

9999999999

for i in

range

(20005)]

#初始化a=[

]for i in

range

(n):

list

(map

(int

,input()

.split())

))#儲存物品

dp[0]=

0for i in

range

(n):

#種類for j in

range

(m,a[i][0

]-1,

-1):

#當前美味度

for k in

range(1

,a[i][1

]+1)

:# 當前的物品的次數

if k*a[i][0

]>j:

#防止超出揹包容量

break

dp[j]

=min

(dp[j-k*a[i][0

]]+k,dp[j]

)if dp[m]

==9999999999

:print

("><"

)else

:print

(dp[m]

)

演算法提高 貪吃的大嘴

演算法提高 貪吃的大嘴 時間限制 1.0s 記憶體限制 256.0mb 提交此題 問題描述 有乙隻特別貪吃的大嘴,她很喜歡吃一種小蛋糕,而每乙個小蛋糕有乙個美味度,而大嘴是很傲嬌的,一定要吃美味度和剛好為m的小蛋糕,而且大嘴還特別懶,她希望通過吃數量最少的小蛋糕達到這個目的.所以她希望你能設計乙個程...

貪吃的大嘴(多重揹包問題)

有乙隻特別貪吃的大嘴,她很喜歡吃一種小蛋糕,而每乙個小蛋糕有乙個美味度,而大嘴是很傲嬌的,一定要吃美味度和剛好為m的小蛋糕,而且大嘴還特別懶,她希望通過吃數量最少的小蛋糕達到這個目的.所以她希望你能設計乙個程式幫她決定要吃哪些小蛋糕.先輸入一行包含2個整數m n,表示大嘴需要吃美味度和為m的小蛋糕,...

藍橋杯 ADV 168 貪吃的大嘴

演算法提高 貪吃的大嘴 時間限制 1.0s 記憶體限制 256.0mb 問題描述 有乙隻特別貪吃的大嘴,她很喜歡吃一種小蛋糕,而每乙個小蛋糕有乙個美味度,而大嘴是很傲嬌的,一定要吃美味度和剛好為m的小蛋糕,而且大嘴還特別懶,她希望通過吃數量最少的小蛋糕達到這個目的.所以她希望你能設計乙個程式幫她決定...