我是一名初學計算機得菜鳥,這也是我第一次寫部落格,但這也會讓我去查閱更多的資料並且更認真的面對這次。
該問題的基本模板:有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 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...