動態規劃之 揹包問題

2021-08-31 06:20:51 字數 1414 閱讀 3249

前些天在做動態規劃的題,感覺動態規劃博大精深,沒有一種特定的模式,學起來很費勁。在這裡就動態規劃中的揹包問題談談。

三種揹包問題:0/1揹包,完全揹包,多重揹包。

0/1揹包:有n件物品和容量為v的揹包,求解將哪些物品放入揹包中可以使獲得的價值最大。

f[i][v]表示將前i件物品恰好放入容量為v的揹包可以獲得的最大價值。

1.子問題:將前i件物品放入揹包中,若第i件物品不放入揹包中,則問題轉化為求前i-1個物品放入容量為v的揹包;若第i件物品放入揹包中,則問題轉化為求前i-1個物品放入容量為v-c[i]的揹包。

2.轉移方程:f[i][v] = max,f[n][v]即為所求。

注意:初始化細節問題,若題目要求恰好裝滿揹包,在初始化時除了f[0]=0,其餘設為負無窮;若題目不要求非要裝滿揹包,初始化f[0..v] = 0;

0/1揹包**:

int dp[14000];

int cost[3403],value[3403];

int main()

} printf("%d\n",dp[m]);

return 0;

}

完全揹包:有n種物品和容量為v的揹包,每種物品可以無限選擇,求解將哪些物品放入揹包中可獲得最大價值。

轉化為0/1揹包:將第i種物品拆分成費用為c*2^k,價值為w*2^k的若干物品,其中k滿足c*2^k

多重揹包:有n種物品和容量為v的揹包,第i種物品最多可有n件,求解問題同上。

轉化為0/1揹包:

將第i種物品分成若干件物品,其中每件物品有乙個係數,這個物品的價值和費用是原來的費用和價值乘以這個係數。使這些係數分別為1、2、4、...、2^(k-1)、n-2^k+1,且k是滿足n-2^k+1>0的最大整數。例如n=13,則可以分為1、2、4、6。這樣就將第i中物品分成了log(n)件。

根據揹包九講,多重揹包**:

#include const int max = 100002;

int v; //揹包的容量

int f[max]; //揹包的最大容量為max. f[i][v]表示前i個物品恰放入容量為j的揹包獲得的最大值,可以優化為f[v]

void multiplepack(int value, int cost, int amount) //value表示價值,cost表示費用,amount表示物品個數

} else

amount -= k;

k = k*2;

} for(i = v; i >= amount*cost; i--)

}}int main()

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

} return 0;

}

參見poj3624 1276

動態規劃之揹包問題

最近刷題遇到好幾道揹包問題,揹包問題是動態規則中的一類體型,在考察演算法的筆試中經常遇到。關於揹包問題,文章 揹包問題九講 中已經做了很多分析,這裡就不再細述,建議好好看看這篇文章。然而文章給了許多案例分析,卻沒有很好的練習。說明 1 本文目的不在於講解揹包問題的分析與講解,而是收集了一些揹包問題。...

動態規劃之揹包問題

一 問題描述 有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?二 總體思路 根據動態規劃解題步驟 問題抽象化 建立模型 尋找約束條件 判斷是否滿足最優性原理 找大問題與小問題的遞推關係式 填表 尋找解組成 找出01揹包問題的最優解以及解組成,然後編...

動態規劃之揹包問題

vivo2019提前批筆試第三題 小v負責一次活動禮品採購,每一款禮品的受歡迎程度 熱度值 各不相同,現給出總金額以及各個禮品的單價 和熱度值,且每個禮品只購買乙個,如何購買可以使得所有禮品的總熱度值最高。輸入 第一行是乙個正整數,表示總金額 不大於1000 第二行是乙個長度為n的正整數陣列,表示禮...