動態規劃:狀態表示(集合: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,當然,每乙個物品都只有一件,而且不可拆分。你的任務是 把這些東西裝入這個揹包,使裝入物品的價值最大。首先,貪心演...