揹包問題 2動態規劃 正解

2021-09-06 19:43:51 字數 1317 閱讀 6334

3

.動態規劃【正解】

有n件物品和乙個容量為v的揹包。第i件物品的體積是c[i],價值是w[i]。求解將哪些物品裝入揹包可使價值總和最大。

狀態轉移方程:

f[i][v]=max

這個方程非常重要,基本上所有跟揹包相關的問題的方程都是由它衍生出來的

偽碼:

for i=1

..n

for v=v..0

f[v]=max;

如果不放第i件物品,那麼問題就轉化為「前i-1件物品放入容量為v的揹包中」,

價值為f[i-1

][v];

如果放第i件物品,那麼問題就轉化為「前i-1件物品放入剩下的容量為v-c[i]的揹包中」,

此時能獲得的最大價值就是f[i-1][v-c[i]]再加上通過放入第i件物品獲得的價值w[i]。

②例題二:

採藥time limit: 1000ms memory limit: 65535kb

submissions:

155 accepted: 50

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

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

input輸入的第一行有兩個整數t(

1<= t <= 1000)和m(1

<= m <= 100

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

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

sample input703

71100691

12sample output

3複製**

#include

# include

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

using

namespace

std;

intmain()

cout

return0;

} 這裡就測試一下,104

510816

551010

動態規劃 揹包問題

給定n個物品,重量是,價值是,包的容量 承重 是w 問,放入哪些物品能使得包內價值最大 1 需要將問題轉化為子問題,通過遞迴實現,且子問題必然與父問題存在關聯 2 定義v i,j 表示為,當item取自前i個items且揹包capacity j 時,揹包問題的最優解,也即最高的價值。3 從前i個it...

動態規劃 揹包問題

不廢話,直接上 動態規劃,揹包問題。輸入為 int n 物品的種類數。int n weight 各件物品的重量。int n value 各種物品的價值。int w 揹包最大的裝載重量。輸出 v n b 的值,最大的裝載價值。x n 各類物品的裝載數量。author huangyongye publi...

動態規劃 揹包問題

1 開心的金明 問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n 元。於是,他把每...