C 揹包 超級揹包大集合

2021-10-04 17:25:15 字數 2605 閱讀 4480

啊哈,經典的揹包問題講完了,這次呢,我們來總結一下揹包問題,並整理程式。

揹包問題思路,就是將每一種放進去的情況都列舉出來,並比較得到最優值,所以,就能求出最大值。這就是為什麼揹包問題中動態規劃比普通遞迴要快,就是因為普通遞迴重複求了很多數值,而動態規劃正好相反,把所有值存起來,對比值,求出,一般遞迴的時間複雜度是指數級,而動態規劃基本上是平方級。

(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 轉化...