題目1455 珍惜現在,感恩生活 多重揹包問題

2021-06-22 01:08:21 字數 1240 閱讀 6665



多重揹包問題,其介於0-1揹包問題和完全揹包問題之間,

每種物品可選的數量既不是無窮也不是唯一,而是介於其中的乙個確定數值,我們可以將其轉化為0-1揹包問題,視其為

k中不同的物品, 但是這樣做的話,物品種類過多影響了效率;

我們可以在這個基礎上做一些優化,可以將k拆分為1.2.4.....k-2^c+1 c為使k-2^c+1大於0的最大整數

我們可以通過對這些若干個原物品組合得到新物品的不同組合

最後總結:

0-1揹包問題是揹包問題的基礎,很多揹包問題都可以轉換成0-1揹包問題去解決

題目描述:

為了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大公尺,每種大公尺都是袋裝產品,其**不等,並且只能整袋購買。請問:你用有限的資金最多能採購多少公斤糧食呢?

輸入:輸入資料首先包含乙個正整數c,表示有c組測試用例,每組測試用例的第一行是兩個整數n和m(1<=n<=100, 1<=m<=100),分別表示經費的金額和大公尺的種類,然後是m行資料,每行包含3個數p,h和c(1<=p<=20,1<=h<=200,1<=c<=20),分別表示每袋的**、每袋的重量以及對應種類大公尺的袋數。

輸出:對於每組測試資料,請輸出能夠購買大公尺的最多重量,你可以假設經費買不光所有的大公尺,並且經費你可以不用完。每個例項的輸出佔一行。

樣例輸入:

1

8 22 100 4

4 100 2

樣例輸出:

400

#includeusing namespace std;

struct e

;int maxl(int a, int b)

e list[2001];

int dp[101];

int main()

list[++ans].p = k*p;

list[ans].h = k*h;

} for(i = 0; i <= n; i++)

for (i = 1; i<= ans; i++)

}cout<

九度 1455 珍惜現在,感恩生活 多重揹包

題目描述 為了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?思路 裸多重揹包,本想練練倍增優化的,ac 後又沒動力了 include i...

HDU 2191 珍惜現在,感恩生活

傳送門 多重揹包。一道帶有歷史的題啊,沉重的回憶。多重揹包的處理關鍵就是將每種物品的可取個數二進位製化,比如一種物品最多取7件,那麼就可以轉化為3件物品 其中每件物品相當於1,2,4件單位物品 這樣包含了取原先物品的任何一種情況 0 7件 並且在求解效率上優於轉化為7件相同物品 本質是從o n 到o...

珍惜現在,感恩生活(多重揹包)

多重揹包問題,將每種物品的個數進行拆分,轉化成01揹包問題 include include include using namespace std int main int argc,char ar int cnt 1 拆分後物品數量 cin bag m for int i 0 i m i w cn...