Luzhiled's Library

This documentation is automatically generated by competitive-verifier/competitive-verifier

View the Project on GitHub ei1333/library

:heavy_check_mark: Knapsack 01 (0-1ナップサック問題) $O(N \sum {v_i})$ (dp/knapsack-01-2.hpp)

0-1 ナップサック問題を次に示す。

重さ $w_i$、価値 $v_i$ であるような $N$ 個の品物がある。重さの和が $W$ 以下となるように選ぶとき、価値の最大値を求めよ。

knapsack_01_2

T knapsack_01_2(const vector<T>& w, const vector<int>& v, const T& W)

重さが W 以下で価値の和の最大値を返す。

計算量

  • $O(N \sum {v_i})$

Verified with

Code

#pragma once

#include <algorithm>
#include <numeric>
#include <vector>

template <typename T>
T knapsack_01_2(const std::vector<T>& w, const std::vector<int>& v,
                const T& W) {
  const int N = (int)w.size();
  const int sum = std::accumulate(v.begin(), v.end(), 0);
  std::vector<T> dp(sum + 1, W + 1);
  dp[0] = T();
  for (int i = 0; i < N; i++) {
    for (int j = sum; j >= v[i]; j--) {
      dp[j] = std::min(dp[j], dp[j - v[i]] + w[i]);
    }
  }
  int ret = 0;
  for (int i = 0; i <= sum; i++) {
    if (dp[i] <= W) ret = i;
  }
  return ret;
}
#line 2 "dp/knapsack-01-2.hpp"

#include <algorithm>
#include <numeric>
#include <vector>

template <typename T>
T knapsack_01_2(const std::vector<T>& w, const std::vector<int>& v,
                const T& W) {
  const int N = (int)w.size();
  const int sum = std::accumulate(v.begin(), v.end(), 0);
  std::vector<T> dp(sum + 1, W + 1);
  dp[0] = T();
  for (int i = 0; i < N; i++) {
    for (int j = sum; j >= v[i]; j--) {
      dp[j] = std::min(dp[j], dp[j - v[i]] + w[i]);
    }
  }
  int ret = 0;
  for (int i = 0; i <= sum; i++) {
    if (dp[i] <= W) ret = i;
  }
  return ret;
}
Back to top page