完全揹包問題中的第二層迴圈為什麼為正序

2021-10-08 22:03:41 字數 575 閱讀 7831

f[i][j] = max(f[i-1][j],f[i-1][j - weight[i]] + value[i]);

這個方程特點:

當前行的值由上一行決定

當用一維陣列表示時,f[j] = max(f[j], f[j-weight[i]]+value[i])

括號中的f[i]表示的是上一次的狀態值,因此需要倒序更新防止下次迴圈被覆蓋

f[i][j] = max(f[i-1][j],f[i][j - weight[i]] + value[i])

用一維陣列表示時,f[j] = max(f[j], f[j-weight[i]] + value[i]);

仔細觀察原始狀態方程可以發現,兩者的狀態方程差別在於max第二個引數

即max第乙個引數依然為上個狀態(上乙個狀態的f[i-1][j]僅用來服務當前狀態的f[i][j], 不會影響當前行後面的狀態),但是第二個引數為本次狀態,也就是說當前行的f[j]需要用到當前行的前面的結果,因此需要正序迴圈。

揹包問題(二) 完全揹包問題

繼0 1揹包問題後,本文介紹完全揹包問題 0 1揹包問題見 完全揹包問題與01揹包問題的區別在於每一件物品的數量都有無限個,而01揹包每件物品數量只有乙個。問題解法其實和01揹包問題一樣,只是初始化的值和遞推公式需要稍微變化一下。初始化時,當只考慮一件物品a時,f 1 j j weight a 遞推...

揹包問題(二) 完全揹包問題

之前我們已經介紹了0 1揹包問題,現在我們以洛谷p1616為例,介紹一下完全揹包問題 完全揹包問題就是將0 1揹包問題中的每樣物品只能拿一次這個限制條件去掉,每樣物品可以無限次裝入。對於完全揹包的圖形解釋,我擷取 leetcode 101 內的解釋展現出來 簡要說一下推導過程 因為我們可以多次拿取物...

(揹包二)完全揹包

public class beibaocomplete int weight int capacity 8 int value int weight int capacity 12 int result packagecomplete value,weight,capacity system.out...