這裡先說一下二維的。
///01揹包
///設物品有n件物品,揹包容量為w
int w; ///代表n件物品的價值
int pw; ///代表n件物品各佔的容量
int f[n+50][w+50]; ///最優解二維陣列
///f[i][j]陣列 代表存i件物品在容量為j的揹包中得到的價值
void package_01()
}printf("%d\n",f[n][w]); ///f[n][w]即為最優解
}
二維的狀態轉移方程
很顯然,f[i][*] 只與 f[j-1][*] 的狀態有關 所以這裡可以有空間上的優化。
先看**:
memset(dp, 0, sizeof(dp));
for(int i=0; i=pw[i]; j--)
}
對於外層的迴圈,每進行一次,dp 儲存的狀態都還是 i - 1 時候的dp ,所以在第二層迴圈使用的時候就相當於使用的是
dp[i - 1][j - pw[i]] + w[i] 與 dp[i-1][j] ..
並且,狀態轉移方程,每一次推導 dp[i][j] 是通過 dp[i-1][j-w[i]] 來推導的,所以一維陣列中j的掃瞄順序應該從大到小(c 到 0),否者前一次迴圈儲存下來的值將會被修改,從而造成錯誤。
動態規劃 01揹包問題滾動陣列 一維陣列
看了好幾天的揹包問題。終於有了一點淺顯的理解 一開始學完01揹包的二維寫法,再看一維寫法是一臉懵逼的,自己推導了幾遍過程,終於是理解了!分享一下蒟蒻的心得 問題如下 有n個重量和價值分別為wi,vi的物品。從這些物品中挑選出總重量不超過w的物品,求所有挑選方案中價值總和的最大值。輸入 n 4 w,v...
揹包九講 01揹包問題(dp 滾動陣列)
現在有n件物品和乙個容量為v的揹包。第i件物品的費用是cost i 價值是value i 每個物品最多只能選一次,求解在不超過揹包容量的限制下,如何選取物品組合能使收益最大化?題型有兩種,一種要求揹包恰好放滿,一種不要求揹包恰好放滿 現在考慮第二種題型,即不要求揹包恰好放滿 將問題分解成子問題 有i...
小梁的揹包(01揹包 一維陣列)
時間限制 c c 2秒,其他語言4秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 小梁來到了伽勒爾地區並參加了聯盟賽熱身賽,比賽小島上有n個精靈散落在島上各處,她有乙個大小為s的揹包,每個精靈的戰鬥值為vi 體積為wi 請問在她臨走之前...