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

動態(tài)規(guī)劃(DP)---- 01背包入門詳解----二維圖是學(xué)會的關(guān)鍵

這篇具有很好參考價值的文章主要介紹了動態(tài)規(guī)劃(DP)---- 01背包入門詳解----二維圖是學(xué)會的關(guān)鍵。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

? ? 動態(tài)規(guī)劃,Dynamic Programing(簡稱DP),個人認為是一種算法思想,用來解決多階段多層次的選擇問題,把一個復(fù)雜的問題分解成每個小塊的子問題然后一個個解決來找到最優(yōu)解。

? ? DP適用重疊子問題最優(yōu)子結(jié)構(gòu)的性質(zhì)的問題。

? ? DP問題范圍分為線性與非線性。線性DP可以順推可以逆推,在理解過程我們可以嘗試畫出二維圖進行理解;非線性DP類似樹形圖,可以從根到葉,也可以從葉到根。

? ? 在學(xué)習(xí)DP的過程我們或多或少的會遇到背包問題,咱們這里就談?wù)?1背包的想法與思路吧。作者是大一新生,發(fā)表文章表達自己對于背包問題的看法,希望高手可以指出不足,感謝!話不多說進入正題......

01背包是最經(jīng)典的DP問題,為什么要學(xué)好01背包呢?是因為咱們很多題目是基于01背包的基礎(chǔ)進行做題的,前面也提到了DP是一種算法思想,不要過于拘束。背包問題大概就是給你一個容量為V的背包以及多個物品,每個物品對應(yīng)一個體積和其價值,這種題目咱們可以分成五個模塊

1.理解題干含義定義dp[i]的含義

2.分析題干關(guān)鍵部分找到狀態(tài)轉(zhuǎn)移方程

3.dp數(shù)組的初始化如何設(shè)計

4.如何正確的遍歷dp數(shù)組

5.打印dp數(shù)組

上面的五個模塊是分析DP問題的步驟,下面我們通過題干來理解01背包的求法......

咱們按照五個模塊分析題干:

1.咱們分析如何定義dp數(shù)組的含義,在這里需要咱們細心閱讀題干,題干表明背包容量是固定的,如果超過背包容量是不就代表無法拿這個物品,所以背包容量是其限制條件,如果咱們假設(shè)i為枚舉到第i個物品,dp[i]代表當(dāng)前的最大金額,在這里咱們要想給其加入限制條件,是不是可以開辟一個二維數(shù)組,因為二維數(shù)組內(nèi)兩個參數(shù)可以代表兩個含義,所以設(shè)置dp[][],其中舉個例子dp[i][j - w[i]]中i代表枚舉到第幾個物品,j - w[i]代表因為背包加入第i個物品導(dǎo)致背包空間剩下j - w[i]。

2.我們創(chuàng)建dp數(shù)組含義,接下來就該分析狀態(tài)轉(zhuǎn)移方程了。

? ? 最開始的情況是max(dp[1][i],dp[1][j - w[1]] + v[1]),因為我最開始拿第一個物品,他的選擇情況只能是要么選擇要么不選擇,dp[1][j]代表不選而dp[1][j - w[1]]代表選擇。注意一下這里是要最大金額,所以咱們要比較我是拿1才能使金額保持最大還是不拿1才能使金額最大,然后繼續(xù)篩選,可以寫出dp[i][j] = max(dp[i - 1][j],dp[i -? 1][j - w[i]] + v[i]),這個就是狀態(tài)轉(zhuǎn)移方程。dp[i - 1][j]代表不選而dp[i - 1][j - w[i]]代表選擇物品,其實個人認為核心思想就是去向問題,也就是將每個情況分別羅列出來來構(gòu)成狀態(tài)轉(zhuǎn)移方程,這道題就是將你選和不選兩種情況通過編程語言說明,然后要選出最大值,所以要在去向前加入max來保證選出的永遠是最大金額。

? ? 這是個遞推過程,你要明白如果你要是認為我怎么這樣拿就可以拿到最大值了,那你肯定是跟我一樣忘記了dp數(shù)組的含義,我們最開始dp數(shù)組設(shè)定的含義是要的是最大金額,也就是說在做DP,你要時刻記住不要忘記設(shè)置的dp數(shù)組本身的含義。個人理解這個想不明白就自己動手畫出二維圖,我的老師告訴我,你想不明白就自己把整個流程自己畫一遍hhh,然后我花了一個多小時才搞明白(哭)。

? ? 如果要是還是想不明白,請看我主頁內(nèi)對于二維背包圖的解釋吧,這里先不介紹了hhh....

3.初始化.對于初始化如何做呢?我個人認為就是單純的找邊界,為了不讓數(shù)組越界導(dǎo)致程序亂碼,我們可以通過自己設(shè)置的dp數(shù)組的定義結(jié)合題意來理解。在本題我們可以發(fā)現(xiàn)dp[0] 代表的含義是選到第0個物品其最大金額,那顯而易見dp[0] = 0。這道題初始化很簡單,但是初始化切記一點,這道題是要最大金額,那我為什么不能初始化為2,3,4....以及1e9呢?(思考),因為你要是取1e9為初始值,你覺得后面再跟dp[0]比較還能有比他大的數(shù)了嗎?哈哈哈哈,所以我們對于最大值問題可以設(shè)置<= 0 的數(shù)(思考)。

4.遍歷數(shù)組。咱們這里很多人包括我也不理解為啥很多博主講這些遍歷順序為啥都不一樣?。?,這里推薦都能看到這里的朋友告訴你,這個東西靠聽網(wǎng)課只能學(xué)到大概,但是細節(jié)需要自己理解,只有自己真正明白二維背包圖怎么畫才會真正初步會01背包的入門,我指的是含義,在二維做法其實大部分可以不需要考慮遍歷順序問題,不妨畫一下圖吧(如果你偷懶,來我主頁看吧hhh),畫完圖你就明白他遞推過程很有趣,跟dfs其實是不同的,但也不是完全不同。但是后期你要是學(xué)壓維的時候你就要重點看遍歷順序問題了,我就不介紹了(沒精力了抱歉)。

5.打印數(shù)組(看代碼吧碼不動了(哭))

#include <stdio.h>
const int N = 1000;
int w[N];//價值
int v[N];//重量
int f[N][N];//i表示遍歷到第幾個  j表示剩余容量
int max(int a,int b)
{
	int res = a > b ? a : b;
	return res;
}
int main()
{
	int n,m;//n表示幾個物品  m表示背包大小
	scanf("%d %d",&n,&m);
	for(int i = 1;i <= m;i++)
	{
		scanf("%d %d",&v[i],&w[i]);
	}
	for(int i = 1;i <= n;i++)//遍歷物品,可以調(diào)換方向的
	{
		for(int j = 0;j <= m;j++)//背包容量,可以調(diào)換方向的
		{
			if(j < v[i])//篩掉背包空間不夠的操作
			{
				f[i][j] = f[i - 1][j];
			}
			else
			{
				f[i][j] = max(f[i - 1][j],f[i - 1][j - v[i]] + w[i]);
			}
		}
	}
	printf("%d",f[n][m]);
	return 0;
}

看到這里喜歡各位能夠理解他的含義,然后看完希望你做一些有關(guān)01背包的改動題,然后后期我會根據(jù)自己學(xué)習(xí)的方向?qū)懸幌?strong>滾動數(shù)組(壓維)。好了好了,感謝觀看,希望點點關(guān)注,同時也希望大佬可以為我指點一下,個人是大一新生,對于算法路線些許迷茫,今天就到這里感謝觀看(愛心)。

看到這里給個好東西hhh......文章來源地址http://www.zghlxwxcb.cn/news/detail-776166.html

子問題的和: dfs(x) = dfs(x + 1) + dfs(x + 2);
最優(yōu)子問題: dfs(x) = max(dfs(x + 1),dfs(x + 2));

到了這里,關(guān)于動態(tài)規(guī)劃(DP)---- 01背包入門詳解----二維圖是學(xué)會的關(guān)鍵的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 從二維數(shù)組到一維數(shù)組——探索01背包問題的動態(tài)規(guī)劃優(yōu)化

    從二維數(shù)組到一維數(shù)組——探索01背包問題的動態(tài)規(guī)劃優(yōu)化

    本文將繼續(xù)上一篇博客爬樓梯之后繼續(xù)講解同樣用到了動態(tài)規(guī)劃的 01背包問題 在解決動態(tài)規(guī)劃問題時,我們經(jīng)常面臨著空間復(fù)雜度的挑戰(zhàn)。01背包問題是一個典型的例子,通常使用二維數(shù)組來表示狀態(tài)轉(zhuǎn)移,但這樣會帶來額外的空間開銷。在本文中,我們將探討如何通過優(yōu)化

    2024年04月11日
    瀏覽(28)
  • 【十七】【動態(tài)規(guī)劃】DP41 【模板】01背包、416. 分割等和子集、494. 目標(biāo)和,三道題目深度解析

    【十七】【動態(tài)規(guī)劃】DP41 【模板】01背包、416. 分割等和子集、494. 目標(biāo)和,三道題目深度解析

    動態(tài)規(guī)劃就像是解決問題的一種策略,它可以幫助我們更高效地找到問題的解決方案。這個策略的核心思想就是將問題分解為一系列的小問題,并將每個小問題的解保存起來。這樣,當(dāng)我們需要解決原始問題的時候,我們就可以直接利用已經(jīng)計算好的小問題的解,而不需要重

    2024年02月03日
    瀏覽(26)
  • 動態(tài)規(guī)劃入門之01背包變形嗑藥

    P1802 5 倍經(jīng)驗日 - 洛谷 | 計算機科學(xué)教育新生態(tài) (luogu.com.cn) 嗑藥固然可恥,但是能讓你快速變強? ?--魯迅 手動滑稽,話歸正題 動態(tài)規(guī)劃之背包入門01背包模板_愛莉我老婆的博客-CSDN博客 這是01背包的模板,沒看的可以去看看。 我們把藥品總量看成一個背包,我們把打敗每一

    2024年02月12日
    瀏覽(20)
  • 動態(tài)規(guī)劃DP之背包問題3---多重背包問題

    動態(tài)規(guī)劃DP之背包問題3---多重背包問題

    目錄 DP分析: 優(yōu)化: ?二進制優(yōu)化 例題: ? ? ? ? 01背包是每個物品只有一個,完全背包問題是每個物品有無限個。 ? ? ? ? 那么多重背包問題就是 每個物品有有限個 。 有?N?種物品和一個容量是?V?的背包。 第?i?種物品最多有?si?件,每件體積是?vi,價值是?wi。 求解

    2024年03月20日
    瀏覽(43)
  • C++ DP算法,動態(tài)規(guī)劃——背包問題(背包九講)

    有N件物品和一個容量為 V V V 的背包。放入第i件物品耗費的空間是 C i C_i C i ? ,得到的價值是 W i W_i W i ? 。 求解將哪些物品裝入背包可使價值總和最大。 這是最基礎(chǔ)的背包問題,特點是:每種物品僅有一件,可以選擇放或不放。 用子問題定義狀態(tài):即 F [ i , v ] F[i, v] F

    2024年02月16日
    瀏覽(30)
  • 動態(tài)規(guī)劃——01背包和完全背包

    動態(tài)規(guī)劃——01背包和完全背包

    目錄 01背包模型 題目? dp? ?滾動數(shù)組優(yōu)化 第一問? 第二問? 擴展 完全背包 題目? 動態(tài)規(guī)劃?編輯? 滾動數(shù)組優(yōu)化 ?關(guān)于-1的代碼層面優(yōu)化 ???? 背包就是有限制條件的組合問題 有一個背包能容納的體積是v,現(xiàn)在有n個物品,第i個物品的體積為vi,價值為wi。 (1)求這個背包

    2024年01月20日
    瀏覽(22)
  • 算法第十五期——動態(tài)規(guī)劃(DP)之各種背包問題

    目錄 0、背包問題分類 1、?0/1背包簡化版 【代碼】 2、0/ 1背包的方案數(shù) 【思路】

    2023年04月09日
    瀏覽(26)
  • 動態(tài)規(guī)劃之二維費用的背包模型

    前置知識: 01背包問題:動態(tài)規(guī)劃之01背包模型_如何何何的博客-CSDN博客 完全背包問題:動態(tài)規(guī)劃之完全背包模型_如何何何的博客-CSDN博客 多重背包問題:動態(tài)規(guī)劃之多重背包模型_如何何何的博客-CSDN博客 二維費用即背包問題有兩個限制條件。 例題: 有?N?件物品和一個容

    2024年02月15日
    瀏覽(23)
  • 【動態(tài)規(guī)劃專欄】-- 01 背包問題 -- 動態(tài)規(guī)劃經(jīng)典題型

    【動態(tài)規(guī)劃專欄】-- 01 背包問題 -- 動態(tài)規(guī)劃經(jīng)典題型

    目錄 背包問題概述 01 背包問題 01背包??? 【算法原理】 第一問 第二問 C++ 算法代碼 復(fù)雜度分析 【空間優(yōu)化 - 滾動數(shù)組】 C++ 算法代碼 復(fù)雜度分析 分割等和子集?? 【算法原理】? 對于類01背包問題 C++ 算法代碼? 【空間優(yōu)化 - 滾動數(shù)組】? C++ 算法代碼 目標(biāo)和?? 【算

    2024年02月05日
    瀏覽(21)
  • 【筆記】動態(tài)規(guī)劃(1)---01背包和完全背包

    集合:選法集合 屬性:最優(yōu)選擇 集合的劃分 狀態(tài)表示 集合:所有只考慮 第i個物品前的 且總體積不大于j的所有 選法 。 屬性:在所有集和中, 價值最大的選法 。 狀態(tài)計算 集合的劃分:總是在(第 i - 1個) 狀態(tài)最優(yōu)時,計算 第 i 個狀態(tài)。 背包已經(jīng)最優(yōu),故對于任意容積

    2024年02月02日
    瀏覽(23)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包