揹包演算法(一維優化解析)

2021-09-25 23:33:55 字數 1631 閱讀 1327

辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說:「孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡,你可以採到一些草藥。如果你是乙個聰明的孩子,你應該可以讓採到的草藥的總價值最大。」

如果你是辰辰,你能完成這個任務嗎?

輸入格式

第一行有22個整數t(1 \le t \le 1000)t(1≤t≤1000)和m(1 \le m \le 100)m(1≤m≤100),用乙個空格隔開,tt代表總共能夠用來採藥的時間,mm代表山洞裡的草藥的數目。

接下來的mm行每行包括兩個在11到100100之間(包括11和100100)的整數,分別表示採摘某株草藥的時間和這株草藥的價值。

輸出格式

11個整數,表示在規定的時間內可以採到的草藥的最大總價值。

輸入輸出樣例

輸入 #1

70 3

71 100

69 1

1 2輸出 #1

3

#include

using namespace std;

intmain()

;int a[m]

,v[m]

;for

(int i=

0;i)for

(int i=

0;i)for

(int j=n;j>=a[i]

;j--)}

cout<;return0;

}

第一次迴圈先將該資料所佔位置後空閒的地方記上該資料的價值,從而當再次進行迴圈的時候因為空閒的地方是右側,所以如果該點(j-a[i])原先資料則說明該點可以放在此處空閒位置,而max判斷式有兩個作用

1 賦值

將可以放在該空閒區的數值加進最後乙個陣列單位內。

2 判斷得出最優方案

因為某一數值的空閒區可能比較大所以可以包含著其他數值的小空閒區

而某乙個資料可能在大空閒區內但是卻不在小空閒區里,所以進行判斷

將該資料是否比小空閒區資料更適合,於是進行取代和賦值

最後因為陣列最後乙個元素是最開始的空閒單位,所以所有的計算都要從它開始因此資料結果可能在許多陣列元素裡面但是肯定在最後乙個陣列中有結果。

例題二若每種草藥都能無限制採摘,那麼最優方案是

//從左邊開始

#include

using namespace std;

intmain()

;for

(int i=

0;icout<;return0;

}

理解思路:

首先還是將空閒區域進行賦值,然後慢慢向右移當在賦值過程中該值小於空閒區,於是又可以將空閒區縮小累加且將該值新的空閒區進行賦值,直到累加到最後乙個陣列元素.

//從右邊開始

#include

using namespace std;

intmain()

;for

(int i=

0;icout<;return0;

}

01揹包 一維空間優化

01揹包是最最基礎的揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接...

完全揹包問題(一維陣列優化)

問題描述 有n件物品和乙個容量是v的揹包。每件物品都有無限件可用。第i件物品的體積是vi,價值是wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸入格式 第一行兩個整數n v,用空格隔開,分別表示物品數量和揹包容積。接下來有n行,每行兩個整數vi,wi,用空格隔開,分...

多重揹包優化演算法

二進位制優化 題面 有n中面額的錢,每種有ci個,問1 m裡有多少個數能用這些錢組成。1 int n,m,a 105 num 105 dp 100005 2 void comdp int w,intv 3 8void zeroone int w,intv 9 14void multidp int w...