【Luogu】【關卡2-15】動態規劃的背包問題(2017年10月)
阿新 • • 發佈:2017-10-10
splay image 說明 方案 理解 ostream img 如果 一次
任務說明:這是最基礎的動態規劃。不過如果是第一次接觸會有些難以理解。加油闖過這個坎。
P1060 開心的金明
小明的媽媽給小明N元錢,小明想買m件物品,每個物品價值為 價格*重要度,求出不超過N元錢的情況下,最多能買多少價值的物品,輸出價值。
解法:直接的01背包問題,我居然還去看了書。。遞推方程一次寫不出來。方程需要記憶。
dp[i][j]表示前i件物品總價格不超過j元的最大總價值。
需要學習下怎麽在博客園輸入latex公式orz。。。
#include <iostream> #include <vector> #include <cstdio> #includeView Code<cstring> using namespace std; int main() { int n, m; cin >> n >> m; int w[m][2]; for (int i = 0; i < m; ++i) { cin >> w[i][0] >> w[i][1]; w[i][1] *= w[i][0]; } int dp[m+1][n+1]; memset(dp, 0, sizeof(dp)); for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { if (w[i-1][0] > j) { dp[i][j] = dp[i-1][j]; } else { dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i-1][0]] + w[i-1][1]); } } } cout << dp[m][n] << endl; return0; }
dp[0][j] = 0;
dp[i+1][j] =
\dp[0][j] = 0;
dp[i+1][j] = \begin{cases}
dp[i][j] & \text{ if } w[i][0]>j
& \text max(dp[i][j], dp[i][j-w[i][0] + w[i][1]) & \text{ else }
\end{cases}
dp[0][j] = 0;
dp[i+1][j] = \begin{cases}
dp[i][j] & \text{ if } w[i][0]>j
& \text max(dp[i][j], dp[i][j-w[i][0] + w[i][1]) & \text{ else }
\end{cases}
小A點菜
金明的預算方案
采藥
裝箱問題
瘋狂的采藥
【Luogu】【關卡2-15】動態規劃的背包問題(2017年10月)