動態規劃基礎學習 揹包問題 優化寫法

2021-10-25 08:56:53 字數 1809 閱讀 1695

動態規劃:狀態表示(集合:f(i,j)的含義;屬性:求max(例))+狀態計算(如何進行狀態轉移、計算)

由於僅做複習用,具體推導未詳細寫出。

每個物品有且只有乙個。

#include

using

namespace std;

const

int n=

1010

;int n,m;

int f[n]

;int v[n]

,w[n]

;int

main()

} cout<

}

每個物品有無限個。

【唯一從小到大更新w[i]的題類】

#include

using

namespace std;

const

int n=

1010

;int n,m;

int f[n]

,v[n]

,w[n]

;int

main()

每個物品給定了數量。

對於每個物品的數量s[i],用二進位制優化了查詢,複雜度為o(vwlog2(s))。

#include

using

namespace std;

const

int n=

24100

;//這裡的n是根據n的範圍乘上log2(s)得到的

int n,m;

int f[n]

,v[n]

,w[n]

,cnt;

intmain()

if(s>0)

//最後剩餘的(此時s>2^t && s<2^(t+1))

} n=cnt;

//不要忘記更新n的範圍!!!

for(

int i=

1;i<=n;i++

)//用01揹包解法即可

for(

int j=m;j>=v[i]

;j--

) f[j]

=max

(f[j]

,f[j-v[i]

]+w[i]);

cout<

}

物品有多組,每組裡面有多個物品,但每組內只能選乙個物品。

#include

using

namespace std;

const

int n=

110;

int n,m;

int f[n]

,v[n]

[n],w[n]

[n],s[n]

;int

main()

for(

int i=

1;i<=n;i++

)for

(int j=m;j>=

0;j--

)//從大到小,避免覆蓋

for(

int k=

0;k;k++

)//遍歷挑選組內物品

if(v[i]

[k]<=j)

//可裝

f[j]

=max

(f[j]

,f[j-v[i]

[k]]

+w[i]

[k])

;

cout<

}

水完了,碎覺!

揹包問題(動態規劃基礎)

dp i j 表示的是要存放第i個物品時,揹包此時的容量為j,揹包內物品的總價值 weight表示物品佔據揹包的體積 dp i j dp i 1 j dp i 1 j weight i value i 狀態轉移方程我們之前看的關於dp的問題,對於每乙個元素的處理方法就是選和不選 我們的狀態轉移方程也...

動態規劃 揹包問題基礎

1.0 1揹包 var v,p array 0.1000 of longint f array 0.100000 of longint n,m,i,j longint function max a,b longint longint begin if a b then exit a exit b e...

動態規劃基礎 0 1揹包問題

這種揹包問題是最基礎的一類揹包問題。只要掌握的這種,後面的也就是大同小異了。因此,我在這個問題上將講得非常詳細。0 1揹包問題就是存在乙個揹包有著固定的容積m,物品有自己的質量w和價值c,當然,每乙個物品都只有一件,而且不可拆分。你的任務是 把這些東西裝入這個揹包,使裝入物品的價值最大。首先,貪心演...