信息寶典-系統可靠性

山再高,往上爬,總能登頂;
路再長,走下去,定能到達。

信息寶典-系統可靠性

題目描述

太空梯工程作爲一個系統,由n個部件串聯而成,只要有一個部件故障,系統就不能正常運行,爲提高系統的可靠性,每一部件都裝有備用件,一旦原部件故障,備用件就自動進入系統。顯然備用件越多,系統可靠性越高,但費用也越大,那麼在一定總費用限制下,系統的最高可靠性等於多少?
給定一些系統備用件的單價Ck,以及當用Mk個此備用件時部件的正常工作概率Pk(Mk),總費用上限C。求系統可能的最高可靠性。

輸入

第一行:n C
第二行:C1 P1(0) P1(1) … P1(X1)(0≤X1≤[C/Ck])

第 n 行:Cn Pn(0) Pn(1) … Pn(Xn) (0≤Xn≤[C/Cn])
輸出
輸出系統可能的最大可靠性,保留 4位有效數字。

Sample Input

2 20
3 0.6 0.65 0.7 0.75 0.8 0.85 0.9
5 0.7 0.75 0.8 0.8 0.9 0.95

Sample Output

0.6375

Hint

n<=10,C<=100,1<=Ci<=20
輸入爲不定項輸入

題目大意

一節太空梯分爲好幾截,每一截都是相互獨立的。要求所有截同時正常工作的時候,纔算是系統正常工作。
爲了使系統可靠,我們採用增加備用零件的方式,來提高系統可靠性。
每增加一個配件,這一截運行正常的概率就會更新到對應的概率
比如,添加2個一號件,4個二號件。該題樣例中運行正常的概率是0.7×0.9=0.63,同時花費2×3+5×4=26

思路分析

如果採用dfs的話很顯然複雜度過於龐大,TLE是在所難免的。所以得改用動態規劃,很顯然這是每一個樣例選多少的問題,其實可以看做完全揹包來做,考慮每一個樣例選多少個。
先初始化一下dp的第0層,都是1.0。接着,從每一行開始,都要考慮我能在當前的money下能最多買幾個零件。然後考慮這些零件我要買幾個。這樣我們就會得到在一截對應的money下的最優選擇。

解題代碼(Python)

save=[]#概率
val=[]#代價
dp=[]
ans=0
#初始化同態規劃空間
for i in range(25):
    temp=[]
    for j in range(105):
        temp.append(0.0);
    dp.append(temp)
#輸入n,c
n,c=map(int,input().split())
#處理輸入的 價值 概率
for i in range(n):
    temp=input().split()
    val.append(int(temp[0]))
    save.append(list(map(float,temp[1:])))
#動態規劃初始化
for i in range(c+1):
    dp[0][i]=1.0
#完全揹包(二維形式)
for i in range(1,n+1):
    for j in range(c+1):
        for k in range(min(len(save[i-1])-1,j//val[i-1])+1):
            dp[i][j]=max(dp[i][j],dp[i-1][j-val[i-1]*k]*save[i-1][k])
#尋求最大值
for i in range(c+1):
    ans=max(ans,dp[n][i])
#輸出結果
print("%.4f"%ans)

總結

這題的思路很簡單,主要的問題就是在於如何動態規劃,和處理不定輸入。
因爲不定輸入的原因,博主偷個懶直接用Python做了,其實C++是一樣的思路。
這題的核心思想還是完全揹包,只不過這裏的揹包需要用二維的dp記錄。
有問題請及時指出,並爭取在第一時間回覆,感謝支持!

By-輪月

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章