01揹包問題是最經典的動態規劃之一,這道題目甚至是這其中還簡單的一種,因為價值就是本身的重量了。本來比如,w是總重量限制,v是每個的價值。
但一開始我都有點忘了,查詢了一下又勾起了回憶。
1.它把總重量從1到w作為狀態,對初學者並不是很直觀的。但dp本來就是空間換時間的演算法,裡面經常以整數做狀態,數目還既不是太大又不是太小。最終經常是n^2或n^3的複雜度。
2.01揹包問題是個二維陣列的dp,狀態轉移方程式f[i,v]=max(f[i-1,m],f[i-1,m-w[i]]+v[i])。其中f[i,m]表示前i個元素在m是重量限制時的**最大值。f[i-1,m]表示不選擇i的情況,後面是選擇i的情況。
3.但注意到f[i-2,m]肯定小於f[i-1,m]所以可以只保留f[m]作為當前m為重量限制時的**最大值,那麼f[m]=max(f[m-w[i]]+v[i],f[m])。化二維為一維。
4.本人的ac程式仍然用了二維陣列,下次可以簡化。
5.要注意邊界條件i<=v,這裡最大重量是可以取到的。
#include using namespace std;int mx[31][20005];
int w[31];
int main()
for (int i = 0; i <= v; i++)
for (int j = 0; j < n; j++)
else
}} cout << (v - mx[n-1][v]);
}
ppt:
對於資源類動態規劃問題,我們可以看出,問題描述必須有乙個基本要素:資源,有時這種資源可能是金錢、空間或者時間,問題就是要對這些資源如何分配,一種基本的想法是將資源應用於前i個階段,然後考慮第i個階段和前i-1個階段之間的關係。
設前i個點的消耗j的資源得到的最優值,研究前i-1個點消耗的資源的最優值,利用第i個點決策轉移。
狀態轉移方程一般可寫成: fi(j) = min
WIKIOI 1464 裝箱問題2
這題目其實很簡單 把第i個格仔抽象成乙個i i體積的箱子,那麼這行資料的體積總和為 a i i i 1 i 6 然後用這個總體積去除以6 6,即看能放多少個6 6體積的箱子 這個時候要注意!如果能除盡則證明正好分配完整,否則則需要額外再加1個箱子,這裡只要把tot強制轉換成float型再除再比較即可...
wikioi 1014 裝箱問題 揹包)
有乙個箱子容量為v 正整數,0 v 20000 同時有n個物品 0 n 30 每個物品有乙個體積 正整數 要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。乙個整數v,表示箱子容量 乙個整數n,表示有n個物品 接下來n個整數,分別表示這n 個物品的各自體積 乙個整數,表示箱子剩餘空間。1 ...
WIKIOI 1319 玩具裝箱
p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為1.n的n件玩具,第i件玩具經過壓縮後變成一維長度為ci.為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時如果乙個一...