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

2021-10-07 04:29:45 字數 1216 閱讀 2669

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

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

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

思路:很容易想到這是乙個簡單的多重揹包問題,只要將每個蛋糕被吃的數量當作狀態計算的變數就行了。題目要求的屬性是最小值,所以理應將狀態 f 初始化為inf。

**如下:

#include

#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

using

namespace std;

typedef

long

long ll;

const

int n =55;

const

int m =

2e4+10;

const

int inf =

0x3f3f3f3f

;int f[m]

;int v[n]

, w[n]

;int n, m;

intmain()

if(s >0)

} n = cnt;

f[0]

=0;//注意這裡要將0點初始化為0,否則狀態轉移會出錯。

for(

int i =

1; i <= n; i++

)for

(int j = m; j >= v[i]

; j--

) f[j]

=min

(f[j]

, f[j - v[i]

]+ w[i]);

//如果m點沒有被改變,即無法正好湊到m,就輸出"><"

if(f[m]

== inf) cout <<

"><"

<< endl;

else cout << f[m]

<< endl;

return0;

}

多維多重揹包問題 多重揹包問題

悼念512汶川大 遇難同胞 珍惜現在,感恩生活 急!災區的食物依然短缺!為了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙...

揹包問題 多重揹包

有n種物品和乙個容量為w的揹包。第i種物品最多有n i 件可用,每件重量是w i 價值是v i 求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。1.使用三重迴圈進行遞推 狀態轉移式為 dp i j max 關鍵 如下 void solve printf d n dp n ...

演算法提高 貪吃的大嘴

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