01揹包的狀態轉移方程

2021-08-14 14:38:21 字數 1006 閱讀 8762

這類問題算是再普通不過了,但是,我忘了。特別是狀態轉移方程,記不清怎麼推導的了,於是在這裡做一下回顧吧

設物品個數為n,每件物品的重量為w[i],價值為v[i],揹包承重w,我們用乙個二維陣列來表示最大收益,於是得到了方程

if w[i]>揹包承重j,無法入包:

f[i][j]=f[i-1][j];

else

f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);

這裡的f[i-1][j-w[i]]表示的是當前承重j去掉w[i]的最大收益,再加上v[i]就是當前f[i][j]的另一種收益,將這個收益和f[i-1][j]對比得到最大收益。

舉個例子:

#include

using

namespace

std;

int main()

}; int ncost[6] = ; //花費

int nvol[6] = ; //物體體積

int bagv = 12;

for( int i = 1; i< sizeof(ncost)/sizeof(int); i++)

cout

<5][12]0;}

**是我找的別人的,因為我懶得寫了(原諒我),貼上**的原文:

最後在抄這位大佬的一句話:

動態規劃(dynamic programming,dp)與分治區別在於劃分的子問題是有重疊的,解過程中對於重疊的部分只要求解一次,記錄下結果,其他子問題直接使用即可,減少了重複計算過程。

動態規劃求解具有以下的性質:

最優子結構性質、子問題重疊性質

最優子結構性質:最優解包含了其子問題的最優解,不是合併所有子問題的解,而是找最優的一條解線路,選擇部分子最優解來達到最終的最優解。

子問題重疊性質:先計算子問題的解,再由子問題的解去構造問題的解(由於子問題存在重疊,把子問題解記錄下來為下一步使用,這樣就直接可以從備忘錄中讀取)。其中備忘錄中先記錄初始狀態。

c 多重揹包狀態轉移方程 01揹包問題

最近在刷coursera的演算法課程式設計作業,發現兩年不碰coding實在是忘得差不多了。做到dp題不得不翻翻書了,發現原來動態規劃的基礎就沒怎麼打好,打算寫一些dp的題解。本文主要介紹簡單的動態規劃問題,用於筆者自己整理思路。從01揹包開始 用一定的總重量,裝最貴的物品。因為每個物品只有裝與不裝...

動態規劃 01揹包(詳解 動態轉移方程)

經典款動態規劃題,偶爾遇見了所以寫一下,這個基礎上的提高版可以看一下我的這篇部落格小a點菜 題目描述 有n件物品,每件物品的重量為t i 價值為val i 現有乙個容量為v的揹包,問如何選取物品放入揹包,使得揹包內物品的總價值最大。其中 每種物品都只有一件。令dp i j 來表示前i件物品裝入容量為...

狀態與狀態轉移方程

在之前的兩節中已經討論了兩類較為經典的動態規劃問題的解法,本節將對兩種演算法進行總結,並 解動態規劃問題的統一思路。回顧兩種經典問題的演算法模式,都先定義了乙個數字量,如最長遞增子串行中用dp i 表示以序列中第i個數字結尾的最長遞增子串行長度和最長公共子串行中用dp i j 表示的兩個字串中前 i...