考試策略
你有一場考試,考試時間為 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 最後取最長上公升子串行長度,得到整個問題的解。具體方法 關鍵部...