01揹包 1維 滾動陣列

2021-08-26 15:03:52 字數 715 閱讀 2285

這裡先說一下二維的。

///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 請問在她臨走之前...