動態規劃之考試策略

2021-10-16 12:21:35 字數 1638 閱讀 8086

考試策略

你有一場考試,考試時間為 120 分鐘。考試有多道題目,你的作答順序不受限制。對於第 i 道題目,你有三種不同的策略可以選擇:

直接跳過這道題目,不花費時間,本題得 0 分。

只做這道題目一部分,花費 p[i] 分鐘的時間,本題可以得到 part[i] 分。

做完整道題目,花費 f[i] 分鐘的時間,本題可以得到 full[i] 分。

依次給定 4 個陣列:p,part,f,full,請你計算出你最多能得到多少分。

樣例 1:

輸入:p=[20,50,100,5], part=[20,30,60,3], f=[100,80,110,10], full=[60,55,88,6]

輸出:94

解釋:

在所有做題選擇中,選擇完成整道第 3 題和整道第 4 題的得分最高。整道第 3 題

耗時 110 分鐘得到 88 分,整道第 4 題耗時 10 分鐘得到 6 分,總共耗時 120 分

鐘得到 94 分。

樣例 2:

輸入:p=[60,60], part=[30,30], f=[100,120], full=[40,60]

輸出:60

解釋:

2 道題目都做一部分和做完整道第 2 題,都能在耗時 120 分鐘下得到最高的 60

分。

解答:

定義dp[i][j]為題目數量為i,剩餘時間為j時,能得到的最大分數:

對於第i道題:

1. 若不做:

dp[i][j] = dp[i-1][j];

2. 若全做:

dp[i][j] = dp[i-1][j-f[i-1]] + full[i-1]

3. 若做一部分:

dp[i][j] = dp[i-1][j-p[i-1]] + part[i-1]

4. dp[i][j]取值為 1,2,3三者中最大值

class

solution

3. 若做一部分:

dp[i][j] = dp[i-1][j-p[i-1]] + part[i-1]

4. dp[i][j]取值為 1,2,3三者中最大值

*/int m = p.

size()

+1;int n =

120+1;

int*

*dp =

newint

*[m]

;for

(int i =

0; i < m; i++)}

for(

int i =

1; i < m; i++)if

(j >= p[i-1]

) dp[i]

[j]= std::

max(dp[i-1]

[j], std::

max(nfull, npart));

}}int nmax = dp[m-1]

[n-1];

for(

int i =

0; i < m; i++

)delete

dp;

return nmax;}}

;

演算法之動態規劃

一 思想 首先要了解 動態規劃 必須先知道什麼叫做 多階段決策 百科裡面對這個問題解釋的很全,我就load一段出來,大家得要好好品味,好好分析。上面圖中最後一句話就定義了動態規劃是要幹什麼的問題。二 使用規則 現在我們知道動態規劃要解決啥問題了,那麼什麼情況下我們該使用動態規劃呢?最優化原理 最優子...

演算法之動態規劃

鋼條切割問題 鋼條切割問題出現在 演算法導論 一書第204頁,作為動態規劃的例題出現,該題內容如下 serling公司購買長鋼條,將其切割為短鋼條 切割工序本身沒有成本支出。公司管理層希望知道最佳的切割方案。假定我們知道serling公司 一段長為i英吋的鋼條的 為pi i 1,2,單位為美元 鋼條...

學習之動態規劃

上公升序列 b1,b2,bn 當b1第一行,輸入數的個數,以下一行輸入各個數。最長子序列長度。vc6.0或其他c語言程式設計軟體 動態規劃思路 1 將問題分成n個子問題 長度為n的序列 2 以每個n為終點,判斷子問題上公升序列的長度。3 最後取最長上公升子串行長度,得到整個問題的解。具體方法 關鍵部...