? ?可分的背包問題是可以用貪心法來解決,而0-1背包問題通常使用動態規劃方法來解決。
可分背包問題:
? ? ? ?在可分背包問題中,物品可以被分割,您可以取走物品的一部分以適應背包的容量。這里的關鍵是物品的價值密度,即單位重量的價值。您可以按照價值密度從高到低的順序選擇物品,先取價值密度最高的物品,然后是次高的,依此類推,直到背包裝滿為止。這種方法稱為貪心算法,因為它每一步都選擇當前看起來最優的選項。
0-1背包問題:
? ? ? ?與可分背包問題不同,0-1背包問題中的物品不能分割。您必須決定是否將整個物品放入背包。這就需要使用動態規劃來找到最優解。動態規劃通過考慮所有可能的組合來確保找到最大價值。它使用一個二維數組 ( dp[i][w] ) 來存儲對于前 ( i ) 個物品,當背包容量為 ( w ) 時的最大價值。狀態轉移方程如下:
𝑑𝑝[𝑖][𝑤]=max?(𝑑𝑝[𝑖?1][𝑤],𝑑𝑝[𝑖?1][𝑤?𝑤𝑒𝑖𝑔?𝑡[𝑖]]+𝑣𝑎𝑙𝑢𝑒[𝑖])
? ? ? ?這里,( dp[i-1][w] ) 表示不選擇第 ( i ) 個物品時的最大價值,而 ( dp[i-1][w-weight[i]] + value[i] ) 表示選擇第 ( i ) 個物品時的最大價值。通過這種方式,動態規劃確保了在每一步都考慮了所有可能的選擇,從而找到了最優解。
軟考上也是有類似的題的。
請填寫1到4個空。
我來解釋這道題吧
首先將c這個二維數組變為0,也就是初始化,那個Memoized_Knapsack這個函數,將c二維數組設置為-1,-1就是已經結束的意思,然后執行Calculate_Max_Value這個函數,這個函數第一件事情就是判斷c[i][j]是否為-1,如果是-1就已經結束了,所以這個1這個空應該填c[i][j]。第二個if判斷也不難看出就是簡單的將物體數量為0的設置為0,把背包容量為0的設置為0.,倘若不知道下面的i,和j代表的什么可以看我上面寫的。i是物品數量,j是背包容量。
所以第二個空應該是j>=w[i],因為只有剩余的背包容量大于或者等于w[i]里面的容量,才可以被選進去,第三個空是再次調用Calculate_Max_Value(v,w,i-1,j-w[i])+v[i]? ,當c[i][j]選的值比那個temp小的時候,就進行一次互換就行了,也就是c[i][j]=temp。
總結:我覺得很好理解吧,求取到第i的物品的價格就是c[i][j],然后求下一個物品和之前的總價格temp,在與之比較,就行了。