經典問題之01揹包

2021-06-05 16:35:54 字數 1146 閱讀 1198

動態規劃像乙個生產車間有好多連續的生產線  乙個階段就是乙個生產線  狀態就是每個生產線物品的狀態  決策就是生產線上根據物品的狀態而對物品的操作.

01揹包問題:

階段: 第一生產線(放不放第乙個物品)→第二生產線(放不放第二個物品)→.......→第n生產線(放不放第n個物品)

第一生產線共

有n-v1個選擇: v=v時放不放  v=v-1時放不放.....v=v-v1時放不放

然後移交給第二生產線: 共

有n-v2個選擇: v=v時放不放  v=v-1時放不放.....v=v-v2時放不放

......

然後移交給第n生產線: 共

有n-v(n)個選擇: v=v時放不放  v=v-1時放不放.....v=v-v(n)時放不放

以第n生產線為例: 當v=v-i時 f[v]>f[v-v(n)]+w 不放 因為v=v-i時前面生產線已經生產出更好的產品了,沒必要再加工了.

狀態:f[v]就是狀態的儲存結構,是連續的,表示產品每個部分的加工情況.

就像工廠裡的乙個大螢幕,上面記錄著產品的每個部分的生產情況. 每個生產線都看著共享著.第乙個生產線生產完了,把其記錄在螢幕上,等第二生產線開始生產時參考,如果能生產出比第一生產線更優的產品則生產,否則不生產.

決策: 每個生產線共有很多的選擇,產品有不同的狀態,例如v可以從0 to v,先讓第一生產先分別加工,再讓第二生產線加工,如過某乙個狀態有比第一生產線生產的更優秀則重新加工.

狀態: 是在前i件物品中,選取若干件物品其體積總和不大於 j,所能獲得的最大價值為f[j]

第乙個階段(即只放第乙個物品) 共有n-v1個狀態(vi為第i個物品的重量)

第二個階段 共有n-v2個狀態

第n個階段 共有n-v(n)個狀態

階段: 第i件物品放不放 共有n個階段

決策: 

是第 i件物品放或者不放

轉移方程: f[v]=max(f[v],f[v-c]+w)

例如:

nyoj 289 蘋果

#include#include#define max(x,y)  x>y?x:y

int f[1005];

int main()

printf("%d\n",f[v]);

}}

經典01揹包問題

乙個旅行者有乙個最多能裝m公斤的揹包,現在有n件物品,它們的重量分別是w1,w2,wn,它們的價值分別為c1,c2,cn。求旅行者能獲得最大總價值。第 1 行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第 2 到 n 1行 每行兩個整數 wi,ci,表示每個物品的重量和價值。10...

揹包問題之01揹包問題

題目 有n件物品和乙個容量為v的揹包。第i件物品的容量是c i 價值為w i 求解將哪些物品裝入揹包可以使得這些物品的費用總和不超過揹包容量,且價值總和最大。基本思路 作為最基礎的揹包問題,特點是 每種物品只有一件,可以選擇放或者是不放。用子問題定義狀態 f i v 表示前i件物品恰好放入乙個容量為...

揹包問題之01揹包

01揹包就是說針對每一件物品,有選擇裝入或者放棄,是屬於動態規劃類的問題。現在假設我們有m件物品,各有價值,揹包承重為10,假設當前可用的承重量為v,當前在抉擇第m件物品是否放入,重量為w1,價值為v1,那麼,如果不放入,我們的價值應該保持不變,並與之前算出的最大價值相同,如果放入,放入後的價值就是...