D - Knapsack 1
キーワード
解説
に対して、 を次のように定義する。
番目までの品物から重さの総和が 以下となるように選んだときの価値の最大値
とする。
番目まで使って良いとき、 番目を使うか使わないかの二通りがある。
- 使わない場合は、 番目までの品物で、重さの総和が 以下となるように選んだときの価値の最大値と同じ。
- 使う場合は、 番目までの品物で、重さの総和が 以下となるように選んだときの価値の最大値に、 番目の価値を加えたもの。
よって次のような漸化式が立てられる。
が 未満のときは、 番目の品物を選べないので、価値は変わらない。
最終的な答えは となる。
計算量は、一回の遷移が で行えるため、全体で となる。
提出コード
int main() {
int n, w; cin >> n >> w;
vector<int> W(n), V(n); rep(i,0,n) cin >> W[i] >> V[i];
vector<vector<ll>> dp(n+1, vector<ll>(w+1, 0));
rep(i, 1, n+1) {
rep(j, 1, w+1) {
if (j - W[i-1] >= 0) dp[i][j] = max(dp[i-1][j], dp[i-1][j-W[i-1]] + V[i-1]);
else dp[i][j] = dp[i-1][j];
}
}
cout << dp[n][w] << endl;
}