動態規劃 入門

2021-10-12 16:25:09 字數 1709 閱讀 1261

我是一名初學計算機得菜鳥,這也是我第一次寫部落格,但這也會讓我去查閱更多的資料並且更認真的面對這次。

該問題的基本模板:有n個物品,他們有各自的體積和價值,現有一定容量的揹包,如何使該揹包裝入的物品的價值和最大

物品序號12

34體積5

678價值

56810

以上我們任意的給了一些數值,為了方便讀者的理解。

首先我們先提一下解決動態規劃問題的過程

1.定義陣列的含義:什麼是定義陣列的含義呢?我舉幾個簡單的例子:比如你可以用f[2] [2]來儲存前三個物品在體積為二的揹包中能裝的最大價值。

2.找陣列之間的關係:這點也是動態規劃的最重要一點,也就是所謂的動態轉移方程。

3.找方程退出的初始值。

下來我們直接來進入一些題目來進行講解

辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說:「孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡,你可以採到一些草藥。如果你是乙個聰明的孩子,你應該可以讓採到的草藥的總價值最大。」

如果你是辰辰,你能完成這個任務嗎?

第一行有 2 個整數 t(1≤t≤1000)和 m(1≤m≤100),用乙個空格隔開,t 代表總共能夠用來採藥的時間,m 代表山洞裡的草藥的數目。

接下來的 m 行每行包括兩個在 1 到 100 之間(包括 1 和 100)的整數,分別表示採摘某株草藥的時間和這株草藥的價值。

輸出在規定的時間內可以採到的草藥的最大總價值。

輸入 #1

70 3

71 100

69 1

1 2

輸出 #1

3
# include

intmain

(void

)int dp[m]

[t+1];

//該陣列的含義揹包問題上面開始所提到的含義

int j;

for(i =

0;i <= t;

++i)

for(i =

1;i < m;

++i)}}

printf

("%d"

,dp[m -1]

[t])

;//這裡輸出最後乙個便是 t體積下的最大價值

return0;

}

好,這段**我們就寫完了,先來我們在來寫一種這段**的優化

# include

# define n 1001

int dp[n]

;int

main

(void

)int j;

for(i =

0;i < m;

++i)

}printf

("%d"

,dp[t]);

return0;

}

這次的分享就此結束

下面我還會寫 完全揹包問題 和 多重揹包問題 感興趣的可以去我的部落格檢視哦!

如果有描述不得當的地方希望能夠指出。

動態規劃入門

1 用 dp 做的題大多數返回值是int boolean,求max min,不能打亂原來輸入順序。2 動態規劃有兩個重要定義,乙個叫 optimal substructure 另乙個叫 overlap subproblem 各種排序 tree 類問題中,都會用到 divide conquer 的思想...

動態規劃入門

大家可以看看這篇文章dp,哪個更容易理解就看哪個!一 動態規劃的定義 動態規劃程式設計是一種針對於解決最優化問題的一種途徑 一種方法,而不是一種特殊演算法,也就是說它沒有固定的模板。在動態規劃中,每走一步都要看看能不能最優,而且動態規劃最擅長的就是多階段問題!二 動態規劃的基本概和基本模型構成 1....

動態規劃入門

學動態規劃自然要從數字三角形開始起步,那麼我們就先從數字三角形開始。數字三角形題目 有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行之外的每個數的左下方和右下方各有乙個數,如下圖所示 3 24 10 1 4 3 2 20 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...