# include <iostream>
# include <iomanip>
namespace
{
{
std::cout << std::left
<< std::setw(4) << "#"
<< std::setw(20) << "Item"
<< std::setw(10) << "Weight"
<< std::setw(10) << "Value" << "\n";
for (
size_t i = 0; i < items.
size(); ++i)
std::cout << std::left
<< std::setw(4) << i
<< std::setw(20) << names[i]
<< std::setw(10) << items[i].weight
<< std::setw(10) << items[i].value << "\n";
}
void print_selection_summary(
const Array<Item> & items,
{
for (
size_t i = 0; i < items.
size(); ++i)
freq(i) = 0;
int total_w = 0;
int total_v = 0;
for (
size_t i = 0; i < selected.
size(); ++i)
{
++freq(selected[i]);
total_w += items[selected[i]].weight;
total_v += items[selected[i]].value;
}
std::cout << "Chosen items:\n";
for (
size_t i = 0; i < items.
size(); ++i)
if (freq[i] > 0)
std::cout << " " << freq[i] << " x " << names[i]
<< " (w=" << items[i].weight
<< ", v=" << items[i].value << ")\n";
std::cout << " [empty]\n";
std::cout << "Total weight: " << total_w << "\n";
std::cout << "Total value : " << total_v << "\n";
}
}
{
std::cout << "\n=== Knapsack Toolkit ===\n\n";
{
std::cout << "Scenario A: Expedition backpack (0/1)\n";
print_rule();
Array<Item> items = {{4, 6}, {3, 5}, {2, 3}, {5, 7}, {1, 2}};
"Water flask", "First aid kit"};
const int capacity = 10;
print_item_table(items, names);
std::cout << "Capacity: " << capacity << "\n";
std::cout <<
"Optimal value: " <<
r.optimal_value <<
"\n";
print_selection_summary(items, names,
r.selected_items);
std::cout << "\n";
}
{
std::cout << "Scenario B: Value-only query (space optimized)\n";
Array<Item> items = {{4, 6}, {3, 5}, {2, 3}, {5, 7}, {1, 2}};
std::cout << "Capacity: 10\n";
std::cout << "\n";
}
{
std::cout << "Scenario C: Infinite stock (unbounded)\n";
const int capacity = 7;
print_item_table(items, names);
std::cout << "Capacity: " << capacity << "\n";
std::cout <<
"Optimal value: " <<
r.optimal_value <<
"\n";
print_selection_summary(items, names,
r.selected_items);
std::cout << "\n";
}
{
std::cout << "Scenario D: Warehouse with limited stock (bounded)\n";
const int capacity = 10;
print_item_table(items, names);
std::cout << "Stock limits:\n";
for (
size_t i = 0; i < items.
size(); ++i)
std::cout << " " << names[i] << " -> " << counts[i] << "\n";
std::cout << "Capacity: " << capacity << "\n";
std::cout <<
"Optimal value: " <<
r.optimal_value <<
"\n";
print_selection_summary(items, names,
r.selected_items);
}
std::cout << "\nDone.\n";
return 0;
}
Classical knapsack problem variants (0/1, unbounded, bounded).
Simple dynamic array with automatic resizing and functional operations.
constexpr size_t size() const noexcept
Return the number of elements stored in the stack.
constexpr bool is_empty() const noexcept
Checks if the container is empty.
Main namespace for Aleph-w library functions.
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.
void print_rule()
Prints a horizontal rule for example output separation.
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.