狀態表示和狀態計算
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 做完整個題...