5 0 1揹包問題(陣列)

2022-09-06 15:51:16 字數 2421 閱讀 2239

參考文章: 

對於揹包問題的解答又冒出乙個新的解法,這是一種自頂向下的解法:

設乙個二維陣列select[i][v]表示的是,將前i個物品放入到容量為v的揹包中所能得到的最大價值。如果使用遞迴的演算法

如何使這人問題轉換為多個子問題呢,也就是對這個問題進行不停地分解,直到可以求解為止,然後「歸」,也就是子

問題都求解了,然後將這些子問題拼湊成大問題,因為大問題是依賴於子問題的。

#include

#include

const

intn=3

;//物品個數

const

intw=50

;//揹包的容量

struct

product

;

product

goods[n

+1]=,,,};

//商品資訊

int

select[n

+1][w

+1];

intpktprob

()

for(

inti=1

;i<=n;

i++)

else

}else

}

}

return

select[n

][w];

}

如上**所示,先首新建了乙個select[n+1][w+1]大小的陣列,用於對子問題進行求解。 

對每乙個物品進行迴圈,而在選擇這些物品的時候,對揹包的容量進行迴圈,求得在前

i個物品的情況下,所能得到的最大的價值。一定要膽白select[i][v]是前面i個商品在容量

為v的情況下所能獲得的最大的價值,當然有時候並不需要那麼大的容量。

intselect[n+1][w+1];這裡我們可以看到,我們將陣列設為n+1和m+1維的情況,是因為我們把揹包的容量為0和商品數為0時這些特殊情況

考慮進去了。

select[i

][0]=0

;這裡可以看到,這裡初使化為0的根據是當容量為0時,肯定是為0的。

for

(intw=

1;ww++)

#include

"onezeropackage.h"

/*

函式入口引數:

pktvolum:揹包的容量

prtvolum:物品的體積

prtvalue: 物品的價值

prtlen : 物品的個數

測試**:

int prtvalue[4]=;

int prtvolum[4]=;

std::cout<

*/

int

onezeropkt

(int

pktvolum

,int

*prtvolum

,int

*prtvalue

,int

prtlen

)

for(

intw=1

;w<=

pktvolum;w

++)

for(

inti=1

;i<=

prtlen;i

++)else

}else

}

}

return

select

[prtlen

][pktvolum

];

}

來自為知筆記(wiz)

揹包問題 01揹包問題

n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...

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

0 1 揹包問題 給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析一波,面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。解決辦法 宣告乙個 大...

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

有n件物品和乙個容量為v 的揹包。放入第i件物品耗費的空間是ci,得到 的價值是wi。求解將哪些物品裝入揹包可使價值總和最大。這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不 放。用子問題定義狀態 即f i,v 表示前i件物品恰放入乙個容量為v的揹包可以 獲得的最大價值。則其狀態轉移方...