国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Acwing-基礎(chǔ)算法課筆記之動態(tài)規(guī)劃(背包問題)

這篇具有很好參考價值的文章主要介紹了Acwing-基礎(chǔ)算法課筆記之動態(tài)規(guī)劃(背包問題)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、01背包問題

1、概述

  1. 01背包中的0和1指的是放與不放,而且不能出現(xiàn)放多個的情況,背包只能放相同物品中的一個;
  2. 首先是對 d [ i ] [ j ] d[i][j] d[i][j] 數(shù)組的解釋,該數(shù)組表示的是只看前 i i i 個物品,總體積是 j j j 的情況下,總價值最大是多少;

2、過程模擬

  1. 不選第 i i i個物品,只考慮前 i ? 1 i-1 i?1個物品, d p [ i ] [ j ] = d p [ i ? 1 ] [ j ] dp[i][j]=dp[i-1][j] dp[i][j]=dp[i?1][j]
  2. 選第 i i i個物品, d p [ i ] [ j ] = d p [ i ? 1 ] [ j ? v [ i ] ] dp[i][j]=dp[i-1][j-v[i]] dp[i][j]=dp[i?1][j?v[i]]
  3. d p [ i ] [ j ] = m a x { 1 , 2 } dp[i][j]=max\{1,2\} dp[i][j]=max{1,2}
  4. 初始條件,一個物品都不考慮 d p [ 0 ] [ 0 ] = 0 dp[0][0]=0 dp[0][0]=0

背包的最大容量為 6 6 6

物品 體積 v v v 價值 w w w
A A A 2 2 2 3 3 3
B B B 3 3 3 5 5 5
C C C 4 4 4 6 6 6
0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6
0 0 0 0 0 0 0 0 0 0
1 1 1 A ( 2 , 3 ) A(2,3) A(2,3) 0
2 2 2 B ( 3 , 5 ) B(3,5) B(3,5) 0
3 3 3 C ( 4 , 6 ) C(4,6) C(4,6) 0

? \Downarrow ?
? \bullet ?對于每一個單元格 i . w e i g h t > j i.weight>j i.weight>j是否成立,按行填寫

0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6
0 0 0 0 0 0 0 0 0 0
1 1 1 A ( 2 , 3 ) A(2,3) A(2,3) 0 0 3 3 3 3 3
2 2 2 B ( 3 , 5 ) B(3,5) B(3,5) 0
3 3 3 C ( 4 , 6 ) C(4,6) C(4,6) 0

? \Downarrow ?

0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6
0 0 0 0 0 0 0 0 0 0
1 1 1 A ( 2 , 3 ) A(2,3) A(2,3) 0 0 3 3 3 3 3
2 2 2 B ( 3 , 5 ) B(3,5) B(3,5) 0 0 3 5 5 8 8
3 3 3 C ( 4 , 6 ) C(4,6) C(4,6) 0

? \Downarrow ?

0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6
0 0 0 0 0 0 0 0 0 0
1 1 1 A ( 2 , 3 ) A(2,3) A(2,3) 0 0 3 3 3 3 3
2 2 2 B ( 3 , 5 ) B(3,5) B(3,5) 0 0 3 5 5 8 8
3 3 3 C ( 4 , 6 ) C(4,6) C(4,6) 0 0 3 5 6 8 9

滾動dp一維數(shù)組版

0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6
0 0 0 0 0 0 0 0 0 0

? \Downarrow ?

0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6
1 1 1 A ( 2 , 3 ) A(2,3) A(2,3) 0 0 3 3 3 3 3

? \Downarrow ?

0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6
2 2 2 B ( 3 , 5 ) B(3,5) B(3,5) 0 0 3 5 5 8 8

? \Downarrow ?

0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6
3 3 3 C ( 4 , 6 ) C(4,6) C(4,6) 0 0 3 5 6 8 9

二、完全背包問題

1、概述

n n n件物品,每件物品的重量為 w [ i ] w[i] w[i],價值為 c [ i ] c[i] c[i]?,F(xiàn)有一個容量為 V V V,的背包,問如何選取物品放入背包,使得背包物品的總價值最大。其中每件物品有無窮件。
既然這樣,不妨像0-1背包問題那樣,先寫出狀態(tài)轉(zhuǎn)移方程,從源頭上摸索。

2、閆氏dp分析完全背包問題

d p { 狀態(tài)表示 ( i , j ) { 集合:所有只從前 i 個物品中選,總體積不超過 j 的方案的集合 屬性: m a x 狀態(tài)計算 d p [ i ] [ j ] = m a x ( d p [ i ? 1 ] [ j ] , f [ i ? 1 ] [ j ? v ] + w 、 f [ i ? 1 ] [ j ? 2 v ] + 2 w 、 . . . . . . ) , d p [ i ] [ j ? v ] = m a x ( d p [ i ? 1 ] [ j ? v ] , f [ i ? 1 ] [ j ? 2 v ] + w 、 f [ i ? 1 ] [ j ? 3 v ] + 2 w 、 . . . . . . ) + w ,兩式組合 d p [ i ] [ j ] = m a x ( d p [ i ? 1 ] [ j ] , f [ i ] [ j ? v ] + w ) 如下圖選第 i 個物品 dp\begin{cases} 狀態(tài)表示(i,j)\begin{cases} 集合:所有只從前i個物品中選,總體積不超過j的方案的集合 \\ 屬性:max \end{cases} \\ 狀態(tài)計算dp[i][j]=max(dp[i-1][j],f[i-1][j-v]+w、f[i-1][j-2v]+2w、......),dp[i][j-v]=max(dp[i-1][j-v],f[i-1][j-2v]+w、f[i-1][j-3v]+2w、......)+w,兩式組合dp[i][j]=max(dp[i-1][j],f[i][j-v]+w)如下圖選第i個物品 \end{cases} dp? ? ??狀態(tài)表示(i,j){集合:所有只從前i個物品中選,總體積不超過j的方案的集合屬性:max?狀態(tài)計算dp[i][j]=max(dp[i?1][j],f[i?1][j?v]+w、f[i?1][j?2v]+2w、......),dp[i][j?v]=max(dp[i?1][j?v],f[i?1][j?2v]+wf[i?1][j?3v]+2w、......)+w,兩式組合dp[i][j]=max(dp[i?1][j],f[i][j?v]+w)如下圖選第i個物品?

Acwing-基礎(chǔ)算法課筆記之動態(tài)規(guī)劃(背包問題),Acwing基礎(chǔ)算法課筆記,算法,筆記,動態(tài)規(guī)劃

3、過程模擬

例如:

容量j
組號 物品 體積v 價值w 0 1 2 3 4 5 6 7
0 (無) 0 0 0 0 0 0 0 0 0 0
1 小古銀手辦 2 1 0 0 1 1 2 2 3 3
2 平板電腦 3 3 0 0 1 3 3 4 6 6
3 筆記本電腦 4 5 0 0 1 3 5 5 6 8
4 無價之寶 5 0 0 0 1 3 5 5 6 8

規(guī)律:
? \bullet ? j < v i j<v_i j<vi?的時候, w i , j = w i ? 1 , j w_{i,j}=w_{i-1,j} wi,j?=wi?1,j?(解釋:如果當前物品裝不進背包,最大價值和前 i ? 1 i-1 i?1個物品的最大價值一樣)
? \bullet ? j ≥ v i j\ge v_i jvi?的時候, w i , j = m a x ( w i ? 1 , j w_{i,j}=max(w_{i-1,j} wi,j?=max(wi?1,j?不裝,裝 ) ) )(解釋:如果裝的下,在裝和不裝中選最大價值)

代碼模板

int m = 0;
int n = 0;
cin >> m >> n;
int v[40] = {};
int w[40] = {};
for (int i = 1; i <= n; i ++){
    cin >> v[i] >> w[i];
}
int dp[40][210] = {};
for (int i = 1; i <= n; ++ i) {
    for (int j = 1; j <= m; ++ j) {
        if (j < v[i]) {
           dp[i][j] = dp[i - 1][j];
        }
        else {
           dp[i][j] = max(dp[i - 1][j], dp[i][j - v[i]] + w[i])
        }
    }
}
cout << "max = " << dp[n][m] <<endl;

優(yōu)化版代碼:

int m = 0;
int n = 0;
cin >> m >> n;
int v[40] = {};
int w[40] = {};
for (int i = 1; i <= n; i ++){
    cin >> v[i] >> w[i];
}
int dp[40][210] = {};
for (int i = 1; i <= n; ++ i) {
    for (int j = v[i]; j <= m; ++ j) {
        dp[j] = max(dp[j], dp[j - v[i]] + w[i])
    }
}
cout << "max = " << dp[n][m] <<endl;

三、多重背包問題

1、概述

求解將哪些物品裝入背包,可使物品體積總和不超過背包容量,且價值總和最大,但要注意的是,每件要取物品不能超過他給出的最大數(shù)量。

2、過程模擬

for(int i = 0; i < n; i ++)
   for(int j = m; j >= v[i]; j --)
      dp[j] = max(dp[j], dp[j - v[i]] + w[i], dp[j - 2 * v[i]] + 2 * w[i],......)//每件物品可以不去,可以取1個,或者取2個等等。

3、多重背包問題的優(yōu)化版本

假設(shè)有一種物品有 s s s 件,若要將其拆分開來,則從 1 1 1 開始循環(huán),每進行一次循環(huán)就乘 2 2 2,并每循環(huán)一次就減去迭代的變量 i i i,代碼如下:

while (n--) {
	int v, w, s;
	scanf("%d%d%d", &v, &w, &s);
	for (int i = 1; i <= s; i *= 2) {
		s -= i;
		goods.push_back({ v * i,w * i });
	}
	if (s > 0)goods.push_back({ v * s,w * s });
}

分組背包問題

1、概述

N N N組物品和一個容量是 V V V的背包。每組物品有若干個,同一組內(nèi)的物品最多只能選一個。每件物品的體積是 v i j v_{ij} vij?,價值是 w i j w_{ij} wij?,其中 i i i是組號, j j j是組內(nèi)編號。

2、過程模擬

例如:
? \bullet ?一個組只能選一個物品

組號 物品 體積v 價值w
1 小古銀手辦 2 1
平板電腦 3 3
2 筆記本電腦 4 5
3 無價之寶 5 0

以下是動態(tài)模擬:
? \bullet ?每個組都有裝和不裝兩種情況
? \bullet ?如果裝某個組的話,這個組只能裝一次文章來源地址http://www.zghlxwxcb.cn/news/detail-854940.html

容量j
組號 0 1 2 3 4 5 6 7
0 0 0 0 0 0 0 0 0
1 0
2 0
3 0

3、代碼演示

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 110;
int n, m;
int v[N], w[N], dp[N];
int main() {
	scanf("%d%d", &n, &m);
	while (n--) {
		int s;
		scanf("%d", &s);
		for (int i = 0; i < s; i++)
			scanf("%d%d", &v[i], &w[i]);
		for (int j = m; j >= 0; j--) {
			for (int k = 0; k < s; k++) {
				if (j >= v[k]) {
					dp[j] = max(dp[j], dp[j - v[k]] + w[k]);
				}
			}
		}
	}
	printf("%d", dp[m]);
	return 0;
}

到了這里,關(guān)于Acwing-基礎(chǔ)算法課筆記之動態(tài)規(guī)劃(背包問題)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Python 算法基礎(chǔ)篇:背包問題的動態(tài)規(guī)劃解法

    背包問題是計算機科學(xué)中一個重要的組合優(yōu)化問題,動態(tài)規(guī)劃是解決該問題的高效算法技術(shù)。本篇博客將重點介紹背包問題的動態(tài)規(guī)劃解法,包括狀

    2024年02月16日
    瀏覽(26)
  • 【第二十五課】動態(tài)規(guī)劃:完全背包問題(acwing-3 / 公式推導(dǎo) / 思路理解 / 優(yōu)化 / c++代碼)

    【第二十五課】動態(tài)規(guī)劃:完全背包問題(acwing-3 / 公式推導(dǎo) / 思路理解 / 優(yōu)化 / c++代碼)

    目錄 思路 樸素代碼 優(yōu)化 公式推導(dǎo)上? 二維代碼? 一維代碼 公式理解上 ? 在開始看完全背包問題之前,可能需要先了解01背包及其解決辦法。 指路?? 【第二十五課】動態(tài)規(guī)劃:01背包問題(acwing-2 / 思路 / 含一維數(shù)組優(yōu)化 / c++代碼) 這個問題和01背包的區(qū)別就是 每件物品可以

    2024年03月19日
    瀏覽(45)
  • acwing算法基礎(chǔ)之動態(tài)規(guī)劃--DP習(xí)題課1

    暫無。。。 暫無。。。 題目1 :最長嚴格上升子序列,要求時間復(fù)雜度為 O ( n l o g n ) O(nlogn) O ( n l o g n ) 。 解題思路:保存每個長度下的最小的結(jié)尾元素值,遍歷數(shù)組元素時,通過二分找到它,然后更新它即可,返回len。 該算法的關(guān)鍵步驟如下: 定義向量 vec , vec[i] 表示

    2024年02月03日
    瀏覽(21)
  • 算法學(xué)習(xí)筆記(動態(tài)規(guī)劃——01背包)

    先來聊聊動態(tài)規(guī)劃,動態(tài)規(guī)劃是分治法的一種體現(xiàn),把一個問題分解成若干個子集,通過當前狀態(tài),經(jīng)過操作得到下一個狀態(tài),最后得到最優(yōu)問題解的一種方法。 步驟: 設(shè)定狀態(tài),保存狀態(tài) 根據(jù)狀態(tài)設(shè)定轉(zhuǎn)移方程 確定邊界 其中的01背包解決的是關(guān)于選擇的動態(tài)規(guī)劃問題,

    2024年03月25日
    瀏覽(25)
  • 【AcWing算法基礎(chǔ)課】第五章 動態(tài)規(guī)劃(未完待續(xù))

    【AcWing算法基礎(chǔ)課】第五章 動態(tài)規(guī)劃(未完待續(xù))

    本專欄文章為本人AcWing算法基礎(chǔ)課的學(xué)習(xí)筆記,課程地址在這。如有侵權(quán),立即刪除。 dp問題的優(yōu)化 :在基本形式dp上作等價變形。 dp問題的解題方法 : 1)狀態(tài)表示 集合 屬性:最大值/最小值/數(shù)量。 2)狀態(tài)計算 集合劃分(不重不漏) 題目鏈接: 2. 01背包問題 - AcWing題庫

    2024年02月12日
    瀏覽(26)
  • 算法系列--動態(tài)規(guī)劃--背包問題(3)--完全背包介紹

    算法系列--動態(tài)規(guī)劃--背包問題(3)--完全背包介紹

    ??\\\"Su7\\\"?? 作者:Lvzi 文章主要內(nèi)容:算法系列–動態(tài)規(guī)劃–背包問題(3)–完全背包介紹 大家好,今天為大家?guī)淼氖?算法系列--動態(tài)規(guī)劃--背包問題(3)--完全背包介紹 鏈接: 完全背包 可以發(fā)現(xiàn)完全背包問題和01背包問題還是特比相似的 分析: 完全背包問題 是 01背包問題 的推廣

    2024年04月25日
    瀏覽(28)
  • 算法系列--動態(tài)規(guī)劃--背包問題(1)--01背包介紹

    算法系列--動態(tài)規(guī)劃--背包問題(1)--01背包介紹

    ??\\\"趁著年輕,做一些比較cool的事情\\\"?? 作者:Lvzi 文章主要內(nèi)容:算法系列–動態(tài)規(guī)劃–背包問題(1)–01背包介紹 大家好,今天為大家?guī)淼氖?算法系列--動態(tài)規(guī)劃--背包問題(1)--01背包介紹 背包問題是動態(tài)規(guī)劃中經(jīng)典的一類問題,經(jīng)常在筆試面試中出現(xiàn),是非常 具有區(qū)分度 的題

    2024年04月16日
    瀏覽(93)
  • 【算法-動態(tài)規(guī)劃】0-1 背包問題

    【算法-動態(tài)規(guī)劃】0-1 背包問題

    ??????歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kuan 的首頁,持續(xù)學(xué)習(xí),不斷總結(jié),共同進步,活到老學(xué)到老 導(dǎo)航 檀越劍指大廠系列:全面總

    2024年02月08日
    瀏覽(27)
  • acwing算法基礎(chǔ)之動態(tài)規(guī)劃--線性DP和區(qū)間DP

    線性DP:狀態(tài)轉(zhuǎn)移表達式存在明顯的線性關(guān)系。 區(qū)間DP:與順序有關(guān),狀態(tài)與區(qū)間有關(guān)。 題目1 :數(shù)字三角形。 解題思路:直接DP即可, f[i][j] 可以來自 f[i-1][j] + a[i][j] 和 f[i-1][j-1] + a[i][j] ,注意 f[i-1][j] 不存在的情況(最后一個點)和 f[i-1][j-1] 不存在的情況(第一個點)。

    2024年02月04日
    瀏覽(21)
  • 算法學(xué)習(xí)17-動態(tài)規(guī)劃01:背包問題

    算法學(xué)習(xí)17-動態(tài)規(guī)劃01:背包問題

    提示:以下是本篇文章正文內(nèi)容: 提示:這里對文章進行總結(jié): ??????

    2024年04月27日
    瀏覽(102)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包