記憶化搜尋

2021-09-28 22:15:16 字數 1887 閱讀 9119

題目描述

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

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

輸入格式

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

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

輸出格式

11個整數,表示在規定的時間內可以採到的草藥的最大總價值。

輸入輸出樣例

輸入 #1複製

70 3

71 100

69 1

1 2輸出 #1複製

3說明/提示

對於30%的資料,m \le 10m≤10;

對於全部的資料,m \le 100m≤100。

先用搜尋(dfs)解題

#include

#include

using

namespace std;

int n,t,

ans(0)

;int tcost[

300]

,value[

300]

;void

dfs(

int pos,

int nowvalue,

int nowtime)

dfs(pos+

1,nowvalue,nowtime)

;dfs

(pos+

1,nowvalue+value[pos]

,nowtime-tcost[pos]);

}int

main()

這種方法當然是過不了的,思考一下如何不借助其他變數來算出答案,但是刪除ans後怎麼記錄答案?一種方法是可以採用返回值。

dfs(pos,nowtime) 指在nowtime時間內採集pos個草藥價值的最大值。

如下:

#include

#include

using

namespace std;

int n,t;

int tcost[

300]

,value[

300]

;int

dfs(

int pos,

int nowtime)

intmain()

emm。。。當然還是不對的但是我們發現給定一定的pos和nowtime輸出的結果是一樣的,這樣可以想到,可以用陣列記錄下來,開乙個陣列用-1初始化,如下所示:

#include

#include

#include

using

namespace std;

int t,m;

int tim[

200]

,val[

200]

,mem[

200]

[1003];

intsolve

(int pos,

int nowtime)

intmain()

ac了

記憶化搜尋

演算法上依然是搜尋的流程,但是搜尋到的一些解用 動態規劃 的那種思想和模式作一些儲存。一般說來,動態規劃總要遍歷所有的狀態,而搜尋可以排除一些無效狀態。更重要的是搜尋還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求...

記憶化搜尋

記憶化搜尋 演算法上依然是搜尋的流程,但是搜尋到的一些解用動態規劃的那種思想和模式作一些儲存。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求解乙個狀態,就將它的解儲存下來,以後再次遇到這個狀態的時候,就不必重新求解了。例1.題目描述 給從左至右排好隊的小朋友們分糖果,要求 1.每個小朋友都...

記憶化搜尋

原文 感謝作者。一.動態規劃 動態規劃 dynamic programming 與 分治思想 有些相似,都是利用將問題分 為子問題,並通過合併子問題的解來獲得整個問題的解。於 分治 的不同之處在 於,對於乙個相同的子問題動態規劃演算法不會計算第二次,其實現原理是將每乙個計算過的子問題的值儲存在乙個表...