This documentation is automatically generated by competitive-verifier/competitive-verifier
#include "dp/knapsack-01-2.hpp"0-1 ナップサック問題を次に示す。
重さ $w_i$、価値 $v_i$ であるような $N$ 個の品物がある。重さの和が $W$ 以下となるように選ぶとき、価値の最大値を求めよ。
T knapsack_01_2(const vector<T>& w, const vector<int>& v, const T& W)
重さが W 以下で価値の和の最大値を返す。
#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;
}