[信息學奧賽一本通]1271:【例9.15】潛水員
這題其實是一個變種背包——二維費用背包

解題思路
將dp[i][j]看作氧氣為i,氮氣為j時的最小重量值,將dp數組所有值設為一個足夠大的數,例如inf(整形最大),將dp[0][0]設置為0,用于記錄dp[ai][bi]的值,初始的時候只有當x=0,y=0時才停止,這時記錄第一個值dp[3][36]=120。
然后當i=2時,到dp[3][36]停下,這時x+a[i]和y+b[i]分別都大于m和n,就得到dp[m][n]=120+129=249,然后再到dp[0][0]停下,記錄下dp[10][25]=129。
然后當i=3時,到dp[m][n]直接停下,然后比較dp[m][n]和dp[m][n]+250的值,這時dp[m][n]值不變,之后一直到dp[3][36]停下,再到dp[0][0]停下,記錄下dp[5][50]=250。
之后同理,最后一共記錄了7個dp數組的值。
最后得出狀態(tài)轉移方程:dp[u][v]=min(dp[u][v],dp[x][y]+c[i])。
其中u=min(m,x+a[i]), v=min(n,y+b[i]),x的范圍為m~0,y的范圍是n~0。

OK,上代碼
標簽: