1. 程式人生 > >【Luogu】【關卡2-15】動態規劃的背包問題(2017年10月)

【Luogu】【關卡2-15】動態規劃的背包問題(2017年10月)

splay image 說明 方案 理解 ostream img 如果 一次

任務說明:這是最基礎的動態規劃。不過如果是第一次接觸會有些難以理解。加油闖過這個坎。

P1060 開心的金明

小明的媽媽給小明N元錢,小明想買m件物品,每個物品價值為 價格*重要度,求出不超過N元錢的情況下,最多能買多少價值的物品,輸出價值。

解法:直接的01背包問題,我居然還去看了書。。遞推方程一次寫不出來。方程需要記憶。

dp[i][j]表示前i件物品總價格不超過j元的最大總價值。

技術分享

需要學習下怎麽在博客園輸入latex公式orz。。。

技術分享
#include <iostream>
#include <vector>
#include <cstdio>
#include 
<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; return
0; }
View Code

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月)