動歸 0 1揹包與完全揹包(洛谷P1048 採藥)

2021-09-28 04:32:04 字數 2610 閱讀 2135

貪心與揹包的不同

題目描述:

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

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

輸入格式

第一行有2個整數t(1≤t≤1000)和m(1≤m≤100),用乙個空格隔開,t代表總共能夠用來採藥的時間,m代表山洞裡的草藥的數目。接下來的m行每行包括兩個在1到100之間(包括1和100)的整數,分別表示採摘某株草藥的時間和這株草藥的價值。

思緒:

填表過程:

設data[i][j]表示前i件物品 總重量不超過j的最大價值 可得出狀態轉移方程 :data[i][j] = max(data[i - 1][j], data[i - 1][j - weight[i]] + value[i])

對第 i 件物品,有2種前狀態:

a. 選擇第 i 件物品,則 data[i][j] = data[i-1][ j-weight[i] ] + value[i]

b. 不選擇第 i 件物品,則 data[i][j] = data[i-1][j]

解法一:

**如下

#define _crt_secure_no_warnings

#define max(a, b) ( (a) > (b) ? (a) : (b))

#include

intmain()

;int size, n;

int weight[

101]=;

int value[

101]=;

int i, j;

scanf

("%d%d"

,&size,

&n);

//揹包大小,物品種類(決定了**的大小)

for(i =

1; i <= n; i++

)for

(i =

1; i <= n; i++

)else}}

printf

("%d"

, data[n]

[size]);

return0;

}

對**空間的優化(一維陣列)

解法二:

在求狀態data[j]的時候,data[j - weight[i]] 還不能被更新過,所以data[j - weight[i]] 要放在data[j]後更新,採用遞減迴圈的方式實現這個功能。

**如下:

#define _crt_secure_no_warnings

#define max(a, b) ( (a) > (b) ? (a) : (b))

#include

intmain()

;int size, n;

int weight[

101]=;

int value[

101]=;

int i, j;

scanf

("%d%d"

,&size,

&n);

//揹包大小,物品種類(決定了**的大小)

for(i =

1; i <= n; i++

)for

(i =

1; i <= n; i++)}

printf

("%d"

, data[size]);

return0;

}

0-1揹包:

有n件物品和容量為m的揹包,給出i件物品的重量以及價值,求解讓裝入揹包的物品重量不超過揹包容量,且價值最大

特點:每個物品只有一件供你選擇放還是不放(這是最簡單的揹包問題)

上述問題就是乙個0-1揹包問題

核心**:

for

(i =

1; i <= n; i++

)}

完全揹包:

有n件物品和容量為m的揹包,給出i件物品的重量以及價值,求解讓裝入揹包的物品重量不超過揹包容量,且價值最大

特點:每個物品可以無限選用(唯一與0-1揹包的不同)

將01揹包的逆序轉化為順序即可

內層迴圈順序進行的話,就代表了在data[j - weight[i]] 體積的情況下,裡面還存有c[i]這個物品,這樣對於同一件物品,會計算多次,直到有其他物品加入滿足最優解大於一件被計算多次後的值為止。

核心**:

for

(i =

1; i <= n; i++

)}

0 1揹包與完全揹包

現有 n 件物品,乙個最大容量為 w 的揹包。第 i 件物品重量為 wi 價值為 vi 已知對於一件物品,你必須選擇取或不取,且每件物品只能被取一次 這就是 0 1 的含義 求放置哪幾件物品進揹包,使得揹包中物品價值最大 或是求最大價值是多少等衍生問題 設 ans n,w 為當揹包容重量為 w 有 ...

揹包問題 01揹包與完全揹包

一 介紹 揹包問題是最廣為人知的動態規劃問題,都是給定限定的揹包容量與物品,求所能裝下的最大價值 完全揹包 有n種物品,每種均有無限多,第i種物品額體積為v i 重量 價值 為w i 01揹包 有n種物品,每種只有乙個,第i種物品額體積為v i 重量 價值 為w i 在揹包問題中,我們把不同種的物品...

01揹包與完全揹包(對比)

題意 某farmer最近買了乙個書架,但是由於書架太高,farmer夠不到書架的頂端,現在屌絲farmer開始通過將自己牧場的牛累起來這樣使所累起來的牛能夠高於書架的高度,但是努力使壘起來的牛的高度比書架的高度盡量能達到最小,求這個最小值。解題思路 初次看到這個題的時候真心的不知道怎麼解,雖然感覺和...