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