啊哈,經典的揹包問題講完了,這次呢,我們來總結一下揹包問題,並整理程式。
揹包問題思路,就是將每一種放進去的情況都列舉出來,並比較得到最優值,所以,就能求出最大值。這就是為什麼揹包問題中動態規劃比普通遞迴要快,就是因為普通遞迴重複求了很多數值,而動態規劃正好相反,把所有值存起來,對比值,求出,一般遞迴的時間複雜度是指數級,而動態規劃基本上是平方級。
(1) 01普通揹包問題
#include
#include
using
namespace std;
int thing[
1000001][
3];//重量(w)是thing[?][0],價值(c)是thing[?][1],f是thing[?][3]
intmax
(int a,
int b)
intmain()
cout<];
return0;
}
(2)完全揹包問題
#include
#include
using
namespace std;
int thing[
1000001][
3];//如有資料內容不懂,請看上篇文章
intmax
(int a,
int b)
intmain()
cout<];
return0;
}
(3)多重揹包問題
#include
int v[
10001
],w[
10001];
int f[
6001];
int n,m,n1;
intmax
(int a,
int b)
intmain()
v[++n1]
=x*s;
w[n1]
=y*s;
//把s以2的指數分堆:1,2,4,...,2^(k-1),s-2^k+1;
}for
(int i=
1;i<=n1;i++
)for
(int j=m;j>=v[i]
;j--
) f[j]
=max
(f[j]
,f[j-v[i]
]+w[i]);
printf
("%d"
,f[m]);
return
0;
(4)混合揹包
#include
using
namespace std;
int f[
1000001
],n[
1000001
],w[
1000001
],c[
1000001];
intmain()
int max=
-99999999
;for
(int i=
1;i<=v;i++
) max=max? f[i]
:max;
cout
}
(5)二維費用的揹包問題
#include
#include
using
namespace std;
int v, u, k;
int a[
1001
], b[
1001
], c[
1001];
int f[
101]
[101];
intmain()
printf
("%d"
,f[v]
[u])
;return0;
}
(6)分組揹包
#include
#include
#include
using
namespace std;
int f[
5000
],c[
5000
],w[
5000
],a[
5000][
5000
],i,j,n,m,s,k,t,p;
int main (
)for
(k=1
; k<=t; k++
)for
(i=n; i>=
0; i--
)for
(j=1
; j<=a[k][0
]; j++)if
(i>=w[a[k]
[j]]
) f[i]
=max
(f[i]
,f[i-w[a[k]
[j]]
]+c[a[k]
[j]]);
cout<;return0;
}
好了,揹包問題到此結束,也希望大家多多學習掌握! 揹包 01揹包,完全揹包,多重揹包
哈哈 01揹包 f i v max 完全揹包 f i v max 多重揹包 f i v max include include include include include define maxn 1000 using namespace std int n,cap int w maxn 重量 花...
揹包學習 多重揹包揹包
有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。狀態轉移方程 f i v max 此時他面臨的不是01揹包的選與不選的問題,而是從n i 裡面選多少個的問題。實現方法 1 轉化...
揹包學習 多重揹包揹包
有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。狀態轉移方程 f i v max 此時他面臨的不是01揹包的選與不選的問題,而是從n i 裡面選多少個的問題。實現方法 1 轉化...