55# include <type_traits>
64 template <
typename W,
typename V>
81 namespace knapsack_detail
83 template <std::
integral W>
88 if constexpr (std::is_signed_v<W>)
92 using UW = std::make_unsigned_t<W>;
94 if constexpr (
sizeof(
UW) >
sizeof(
size_t))
98 return static_cast<size_t>(
uvalue);
101 template <std::
integral W,
typename V>
107 for (
size_t i = 0; i < items.size(); ++i)
129 template <
typename V, std::
integral W>
133 const size_t n = items.size();
145 for (
size_t i = 0; i <= n; ++i)
148 for (
size_t w = 0;
w <= C; ++
w)
150 dp.
append(std::move(row));
153 for (
size_t i = 1; i <= n; ++i)
156 const V vi = items[i - 1].value;
157 for (
size_t w = 0;
w <= C; ++
w)
158 if (
wi <=
w and dp[i - 1][
w -
wi] + vi > dp[i - 1][
w])
159 dp[i][
w] = dp[i - 1][
w -
wi] + vi;
161 dp[i][
w] = dp[i - 1][
w];
167 for (
size_t i = n; i > 0; --i)
168 if (dp[i][
w] != dp[i - 1][
w])
177 for (
size_t k =
sel.size();
k > 0; --
k)
197 template <
typename V, std::
integral W>
201 const size_t n = items.
size();
203 capacity,
"knapsack_01_value",
"capacity");
205 items,
"knapsack_01_value");
211 for (
size_t w = 0;
w <= C; ++
w)
214 for (
size_t i = 0; i < n; ++i)
217 const V vi = items[i].value;
218 for (
size_t w = C;
w >=
wi and w !=
static_cast<size_t>(-1); --
w)
219 if (dp[
w -
wi] + vi > dp[
w])
220 dp(
w) = dp[
w -
wi] + vi;
245 template <
typename V, std::
integral W>
249 const size_t n = items.size();
251 capacity,
"knapsack_unbounded",
"capacity");
253 items,
"knapsack_unbounded");
258 for (
size_t i = 0; i < n; ++i)
261 <<
"knapsack_unbounded: zero-weight item with positive value "
262 <<
"leads to unbounded optimum";
267 constexpr size_t NONE = std::numeric_limits<size_t>::max();
268 for (
size_t w = 0;
w <= C; ++
w)
274 for (
size_t w = 1;
w <= C; ++
w)
275 for (
size_t i = 0; i < n; ++i)
278 dp(
w) = dp[
w -
wi] + items[i].value;
315 template <
typename V, std::
integral W>
321 <<
"knapsack_bounded: items and counts must have same size";
323 const size_t n = items.size();
325 capacity,
"knapsack_bounded",
"capacity");
327 items,
"knapsack_bounded");
338 for (
size_t i = 0; i < n; ++i)
345 const size_t take = std::min(
k,
rem);
347 if (
wi == 0
or take <= C /
wi)
350 static_cast<W
>(
wi * take),
351 static_cast<V>(take) * items[i].
value
361 if (
k > std::numeric_limits<size_t>::max() / 2)
373 for (
size_t k = 0;
k < result.selected_items.size(); ++
k)
375 const size_t ei = result.selected_items[
k];
376 const size_t orig = origin[
ei];
377 const size_t mult = multiplier[
ei];
378 for (
size_t j = 0; j <
mult; ++j)
Exception handling system with formatted messages for Aleph-w.
#define ah_out_of_range_error_if(C)
Throws std::out_of_range if condition holds.
#define ah_domain_error_if(C)
Throws std::domain_error if condition holds.
#define ah_invalid_argument_if(C)
Throws std::invalid_argument if condition holds.
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.
Array< size_t > extract_weights_checked(const Array< Knapsack_Item< W, V > > &items, const char *fn_name)
size_t to_size_checked(const W value, const char *fn_name, const char *field_name)
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.
V value
Value (or profit) of the item.
W weight
Weight (or cost) of the item.
Result of a knapsack computation.
Array< size_t > selected_items
Indices (0-based) of selected items.
V optimal_value
Optimal objective value.
Dynamic array container with automatic resizing.