前些天在做動態規劃的題,感覺動態規劃博大精深,沒有一種特定的模式,學起來很費勁。在這裡就動態規劃中的揹包問題談談。
三種揹包問題: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的正整數陣列,表示禮...