37# include <gtest/gtest.h>
56 for (
size_t i = 0; i < selected.
size(); ++i)
57 total += items[selected[i]].value;
65 for (
size_t i = 0; i < selected.
size(); ++i)
66 total += items[selected[i]].weight;
72 const size_t n = items.
size();
79 for (
size_t i = 0; i < n; ++i)
93 const int capacity,
const size_t i = 0)
95 if (i == items.
size())
99 const int wi = items[i].weight;
100 const int vi = items[i].value;
106 static_cast<int>(
counts[i]) * vi
111 for (
size_t take = 1; take <=
counts[i]; ++take)
113 const int weight =
static_cast<int>(take) *
wi;
114 if (weight > capacity)
117 static_cast<int>(take) * vi
119 capacity - weight, i + 1));
126 const int capacity,
const size_t i = 0)
128 if (i == items.
size())
132 const int wi = items[i].weight;
133 const int vi = items[i].value;
138 for (
int take = 1; take *
wi <= capacity; ++take)
141 capacity - take *
wi,
170 Array<Item> items = {{2, 3}, {3, 4}, {4, 5}, {5, 6}};
176 for (
size_t k = 0;
k <
r.selected_items.size(); ++
k)
178 const auto & it = items[
r.selected_items[
k]];
196 Array<Item> items = {{2, 3}, {3, 4}, {4, 5}, {5, 6}};
240 for (
size_t k = 0;
k <
r.selected_items.size(); ++
k)
241 total_w += items[
r.selected_items[
k]].weight;
272 for (
size_t i = 0; i < items.
size(); ++i)
275 for (
size_t k = 0;
k <
r.selected_items.size(); ++
k)
277 const size_t idx =
r.selected_items[
k];
284 for (
size_t i = 0; i < items.
size(); ++i)
297 std::mt19937
rng(123456);
300 const size_t n = 1 +
rng() % 10;
301 const int capacity =
static_cast<int>(
rng() % 14);
305 for (
size_t i = 0; i < n; ++i)
307 const int w =
static_cast<int>(
rng() % 7);
308 const int v =
static_cast<int>(
rng() % 19) - 4;
325 std::mt19937
rng(424242);
328 const size_t n = 1 +
rng() % 7;
329 const int capacity = 1 +
static_cast<int>(
rng() % 16);
333 for (
size_t i = 0; i < n; ++i)
335 const int w = 1 +
static_cast<int>(
rng() % 6);
336 const int v =
static_cast<int>(
rng() % 16) - 3;
350 std::mt19937
rng(777);
353 const size_t n = 1 +
rng() % 8;
354 const int capacity =
static_cast<int>(
rng() % 15);
360 for (
size_t i = 0; i < n; ++i)
362 const int w =
static_cast<int>(
rng() % 5);
363 const int v =
static_cast<int>(
rng() % 17) - 2;
364 const size_t c =
static_cast<size_t>(
rng() % 4);
376 for (
size_t i = 0; i < n; ++i)
378 for (
size_t i = 0; i <
r.selected_items.size(); ++i)
379 ++
used(
r.selected_items[i]);
380 for (
size_t i = 0; i < n; ++i)
Classical knapsack problem variants (0/1, unbounded, bounded).
Simple dynamic array with automatic resizing and functional operations.
static Array create(size_t n)
Create an array with n logical elements.
constexpr size_t size() const noexcept
Return the number of elements stored in the stack.
T & append(const T &data)
Append a copy of data
void reserve(size_t cap)
Reserves cap cells into the array.
Main namespace for Aleph-w library functions.
and
Check uniqueness with explicit hash + equality functors.
V knapsack_01_value(const Array< Knapsack_Item< W, V > > &items, W capacity)
0/1 Knapsack — value only (space-optimized).
Knapsack_Result< V > knapsack_01(const Array< Knapsack_Item< W, V > > &items, W capacity)
0/1 Knapsack with item reconstruction.
Divide_Conquer_DP_Result< Cost > divide_and_conquer_partition_dp(const size_t groups, const size_t n, Transition_Cost_Fn transition_cost, const Cost inf=dp_optimization_detail::default_inf< Cost >())
Optimize partition DP using divide-and-conquer optimization.
Knapsack_Result< V > knapsack_bounded(const Array< Knapsack_Item< W, V > > &items, const Array< size_t > &counts, W capacity)
Bounded Knapsack with reconstruction.
Knapsack_Result< V > knapsack_unbounded(const Array< Knapsack_Item< W, V > > &items, W capacity)
Unbounded Knapsack with reconstruction.
An item for knapsack problems.