0 1揹包總結

2021-07-08 10:29:01 字數 1802 閱讀 3102

題目1123:採藥

題目描述:

辰辰是個很有潛能、天資聰穎的孩子,他的夢想是稱為世界上最偉大的醫師。

為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。

醫師把他帶到個到處都是草藥的山洞裡對他說:

「孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。

我會給你一段時間,在這段時間裡,你可以採到一些草藥。如果你是乙個聰明的孩子,你應該可以讓採到的草藥的總價值最大。」

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

輸入:輸入的第一行有兩個整數t(1 <= t <= 1000)和m(1 <= m <= 100),t代表總共能夠用來採藥的時間,m代表山洞裡的草藥的數目。

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

輸出:可能有多組測試資料,對於每組資料,

輸出只包括一行,這一行只包含乙個整數,表示在規定的時間內,可以採到的草藥的最大總價值。

樣例輸入:

70 3

71 100

69 1

1 2樣例輸出:

3揹包問題要你求出的是最優解,有n件物品和體積為v的揹包,每件物品都有它的價值和體積,記為value[i]和bulk[i], 要求哪些物品放進去可以使其物品的總體積不超過揹包的體積並且價值最大。

p[i][j] = max; 這個是狀態轉換方程

其實是 : 因為每件物品有兩種選擇,放或者不放,那麼只要比較放這個物品的時候的價值和不放這個物品的時候的價值哪個大,然後選擇價值更大的就可以了。

式子中的p[i - 1][j - bulk[i]] + value[i]意思是你放這個物品的時候的價值,為什麼要減去bulk[i]?因為你如果放這個物品的時候價值更大,那麼肯定要保證放這個物品的時候它的體積加上揹包裡面原有的物品體積要不超過揹包的總體積才行。當初難以理解地方就是這裡。p[i-1][j]就是不放時候的揹包中物品的總價值,最後比較兩者之間的價值誰更大,來決定用誰。

這份**是用的二維陣列存放的方法來做的

#include#include#define t 1002

#define m 102

int main()

for (int i = 1; i <= m; i++)//從第乙個物品開始

else

arr[i][j] = arr[i - 1][j];

} }

printf("%d\n" , arr[m][t]);

}return 0;

}這份**採用的一維陣列存放做的,優化了空間複雜度,而時間複雜度仍然為n^2

一維陣列的下標表示時間,一維陣列中存放價值,而二維陣列中則是第一維下標表示物品數,第二維下標表示時間,a[i][t]中存放價值

#includeusing namespace std;

#define t 1000

#define m 101

int main()

; int mach_t[m], value[m];

int ti, num;

cin >> ti >> num;

for (int i = 1; i <= num; i++)

for (int i = 1; i <= num; i++)

else

arr[j] = arr[j];

} }cout << arr[ti] << endl;;

return 0;

}0-1揹包問題個人感覺最好在紙上推算幾遍,不然搞不明白

最初看到採藥的時候,並不知道是揹包問題,就想著用最笨的方法做做看,結果很悲劇。

揹包問題 01揹包總結

寫這篇部落格的原因是因為自己初學揹包的時候覺得好玄學。只是知道怎麼寫,但是具體是為什麼覺得很玄妙。在此其實希望和我一樣的小白萌新早點明白其中的原理,其實原理很簡單,只要懂了這個圖,我想01揹包就不成問題了。首先要明確這張表是至底向上,從左到右生成的。關於01揹包的題目暫時整理了一點。1.簡單01揹包...

01揹包,多重揹包,完全揹包 總結

可以先看下這篇部落格理解下動態規劃的思想 初識動態規劃 寫在前面的 這篇部落格主要寫的是,乙個容量為v的揹包去裝n個物品能獲得的最優解的問題 問題簡述 現在有乙個揹包,它能容納的最大重量為v,問揹包所能帶走的最大價值是多少?01揹包 有n個物品,每個物品的重量為w i 每個物品的價值為h i 對於每...

揹包問題總結 01揹包 完全揹包 多重揹包

1 01揹包問題 有n個物品,每個物品只有一件。動歸方程 1 二維陣列解法 dp i j max 2 一維陣列解法 dp j max 附 hdu 2602 bone collector 二維陣列 include include int dp 1005 1005 int main else dp i ...