dp(揹包問題,學習中 )

2021-10-10 07:40:13 字數 3028 閱讀 9799

狀態表示和狀態計算

dp優化一般是對狀a態方程進行優化

dp思考結構:

dp 狀態表示 – 集合 ---- 條件

---- 所有選法

– 屬性 (max,min, number)

狀態計算------集合的劃分

01揹包

//01揹包 

#include

using

namespace std;

int v[

1010];

int w[

1010];

int dp[

1010][

1010];

intmain()

for(

int i =

1;i<=n;i++)}

cout<[v]

}優化???:(沒太懂)

滾動陣列:求乙個值只需要前面乙個值,就不斷跟新重複

#include

using

namespace std;

int v[

1010];

int w[

1010];

int dp[

1010];

intmain()

for(

int i =

1;i <= n;i++)}

cout<

}

完全揹包

完全揹包(無窮個)

f[i]

[j]= f[i-1]

[j-w[i]

*k]+k*v[i]

;//k不會無限大 ,不超過體積

//完全揹包

#include

using

namespace std;

int v[

1010];

int w[

1010];

int dp[

1010][

1010];

intmain()

for(

int i =

1;i<=n;i++)}

} cout<[v]

}//優化

f[i,j]

= f[i-

1,j-k*w[i]

]+v[i]

*k;f[i,j]

= f[i-

1,j]

+ f[i-

1,j-w]

+v + f[i-

1,j-

2*w]

+v*2

+ f[i-

1,j-

3*w]

+v*3..

....

f[i,j-w]

= f[i-

1,j-w]

+ f[i-

1,j-

2*w]

+v + f[i-

1,j-

3*w]

+ v*2.

....

.發現與01揹包比較

f[i,j]

=max

(f[i-

1,j]

,f[i,j-w]

+v)f[i,j]

=max

(f[i-

1,j]

,f[i-

1,j-w]

+v);

多重揹包

多重揹包(各物品有限且物品之間可能不同)

暴力寫法(和完全揹包相似,多乙個判斷條件)

不能直接用優化完全揹包的方法來優化

(單調堆)

二進位制優化

打包成 2 的整次冪

例如:s =

2001,2

,4,8

,32,64

,731271,2

,4,8.

....

.2的k次 ,

c(c<

2的k+

1次方,完美拼接)

拼湊出0

~2的k+1-

1 從0

~s中任一一種拼法都能用前面的數拼湊出來出來

c~s拆分成 logs 個物品,再對新拆分的物品做一遍01揹包問題

物品種數n,體積v,每件物品個數s

時間複雜度:nlogs

#include

#include

using

namespace std;

const

int maxn =

2010

;int w[maxn]

,v[maxn]

,s[maxn]

;//表示物品體積,價值和數量

int dp[

25000];

//物品的種數 * log物品的數量

intmain()

if(c >0)

} n = cnt;

//再用01揹包的優化版

for(

int i =

1;i <= n;i++)}

cout<

}

分組揹包

分組揹包

n組物品,容量v的揹包

每組物品體積若干,同一組內的物品最多只能選乙個,求最大價值

列舉每組物品選哪個

#include

#include

using

namespace std;

const

int n =

105;

int w[n]

[n],v[n]

[n],s[n]

;int dp[n]

;int

main()

}for

(int i =

1;i<=n;i++)}

} cout<<}

DP 揹包問題

大牛 以下使用滾到陣列 若輸入要求一般,可以邊定義狀態邊輸入,不需儲存 memset f,0,sizeof int n 若求最小值,除 f 0 其餘初始化為 inf,f 0 0是必須的 求最大最小都一樣 確保有從無到有的起點 0 1揹包 一般形式 f i v max f i 1 v f i 1 v ...

揹包問題 DP

01揹包 現在有1個體積為mmax的揹包和n種物品 每種物品只有1個 每種物品的體積和價值分別是v i 和w i 求這個揹包最多可以裝價值多少的物品。這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。用子問題定義狀態 設f i j 表示前i件物品恰放入乙個容量為j的揹包可以獲得的最大...

DP 揹包問題

小明同學在參加一場考試,考試時間2個小時。試卷上一共有n道題目,小明要在規定時間內,完成一定數量的題目。考試中不限制試題作答順序,對於 i 第道題目,小明有三種不同的策略可以選擇 1 直接跳過這道題目,不花費時間,本題得0分。2 只做一部分題目,花費pi分鐘的時間,本題可以得到ai分。3 做完整個題...