對於動態規劃問題最重要的是如何定義好dp陣列的含義,可以通過dp陣列前面的值推出後面的結果。
對於0-1揹包問題,我定義的dp陣列的含義為:dp[i]表示容量為i的選擇的最大價值。
容量為w的袋子,i∈[1,w],對於容量為i的時候,當前第j(j∈[0,n])個物品可以選擇裝進袋子或者不裝進袋子:
也就是dp[i] = max(dp[i-1],val[i-1]+dp[i-wt[i-1]]);這裡i-1是應為容量從1開始,物品下標從0開始
for i in w:
for j in n:
dp[i] = max(dp[i-1],val[i-1]+dp[i-wt[i-1]];
但是你會發現這樣做的話,對於dp[i]來說,如果選擇了第i個數,由於j是從[0,n]的,那麼就會有可能選擇重複的物品,所以這樣的思考是不對的,不過,這個剛好對應完全揹包問題的解法了。下面再分析一下為什麼不對:對於當前的i容量來說,可以選擇第j個物品也可以不選這是沒毛病的。我們看如果選擇當前物品,總價值就是當前物品價值+剩下容量的最大值,那就有可能剩下的容量和當前容量相等,就會選擇到重複的物品了。所以這裡的dp定義是不對的,它不能限制當前物品選中後再處理剩餘容量的時候不重複選擇的問題。
如果能夠限定 【當前物品被選中後,剩餘容量只能在當前物品前的所有物品中選擇最大價值】那問題不就解決了麼?
dp定義為前i個物體選擇的最大價值,不對,是前i個物體容量為j(j∈[0,w])選擇的最大價值。故很明顯需要二維陣列dp[i][j]。
dp[0][...] = dp[..][0] = 0;
當第i個物體容量為j時:
① 不選擇第i個物體,則dp[i][j] = dp[i-1][j];當前最大價值 = 在前i-1個中選擇容量為j的最大價值
② 選擇第i個物體,則dp[i][j] = val[i-1]+dp[i-1][j-wt[i-1]];當前最大價值 = 選擇的價值+在前i-1個物體中選擇容量為(j-wt[i-1])的最大價值
int maxvalofpackage(vector&wt,vector&val,int n,int w)
else
} }return dp[n][w];
}
完全揹包問題就是和這些物品可以重複塞入揹包中。我們來定義一下dp.
dp[i]定義為容量為i選擇得到最大價值
當容量為i(i∈[1,w]),對於j(j∈[0,n])而言,可以選擇將第j個物品裝入容器中也可以選擇不裝進去。不裝進去的dp[i] = dp[i-1]表示容量為i-1的最大值,裝進去則為val[j]+dp[i-wt[j]];由於dp[i]一直在更新,所以需要dp = max3(dp[i],dp[i-1],val[j]+dp[i-wt[j]]);
顯然,容量為0時,dp[0] = 0;
int max3(int a, int b, int c)
int completemaxvalofpackage(vector&wt, vector&val, int w)
} }return dp[w];
}
...
題目:dp[i][j]表示來到當前位置的不同路徑,那麼當前路徑可以來自左邊dp[i][j-1]也可以來自上面dp[i-1][j],在邊界的時候只有1條路徑。
當只有乙個方格的時候,顯然只有一條路徑,dp[0][0] = 1;
int uniquepaths(int m, int n)
else }}
return dp[m - 1][n - 1];
}
題目:
dp[i][j]表示來到當前位置的最小路徑和,那麼當前路徑可以來自左邊grid[i][j]+dp[i][j-1]也可以來自上面grid[i][j]+dp[i-1][j]
當只有乙個方格的時候,最小路徑和系grid[0][0]
這裡主要考慮邊界條件的最小路徑和,在上邊界路徑只能來自左邊,在左邊界路徑只能來自上面
int minpathsum(vector>& grid)
else if(i==0)
else if(j==0)
else}}
return dp[grid.size()-1][grid[0].size()-1];
}
動態規劃學習(2)
1 題目 有n個重量和價值分為w i v i 的物品。從這些物品中挑選出總重量不超過w的物品,求所有挑選方案中價值總和的最大值。限制條件 1 n 100 1 w i v i 100 1 w 10000 2 時間複雜度 o w n 3 總結 下面 為01揹包中經過優化後的方法。時間複雜度為o w n ...
學習筆記 動態規劃
動態規劃 多階段決策 意義 求解決策過程最優化的數學方法 基本思想 將待求解的問題分為若干個階段,即若干個互相聯絡的子問題,在求解子問題的過程中逐步推導出原問題的解。核心 在求解子問題的過程中,儲存子問題的解。注1 動態規劃的思想實際上和遞迴相似。都是通過逐步推導,得到答案。而用它們解題時的核心也都...
學習筆記 動態規劃
bullet 先來看乙個問題 小張現在有8個任務可選,每個任務都必須在規定的時間段完成不能多也不能少,而且每個任務都有對應的報酬如下圖,問小張應如何選擇才能拿到最多的報酬?那我們換種方法來解決這個問題吧,首先,每個任務都有選和不選兩種選擇,我們從最後乙個任務開始模擬這個過程。首先我們需要先用乙個陣列...