// De la decisión a la optimización, usando la decisión como una caja negra.
#include <iostream>
#include "knapsack_search.h"

int main() {
    std::vector<Item> items = {{4, 10}, {3, 7}, {2, 4}, {5, 12}, {1, 1}};
    const Number capacity = 9;
    int calls = 0;
    Number total = 0;
    for (const Item& item : items) total += item.value;
    Number best = knapsack_optimum_by_search(items, capacity, calls);
    std::cout << "objetos (peso, valor):";
    for (const Item& item : items) std::cout << " (" << item.weight << ", " << item.value << ")";
    std::cout << "\ncapacidad " << capacity << ", suma de valores " << total << '\n';
    std::cout << "óptimo por búsqueda binaria: " << best << ", con " << calls << " llamadas a la decisión\n";
    std::cout << "óptimo por la tabla de la semana 7: " << knapsack_best(items, capacity) << '\n';
    std::cout << "objetos elegidos, con otra llamada por objeto:";
    for (std::size_t i : knapsack_items_by_search(items, capacity)) std::cout << ' ' << i;
    std::cout << '\n';
    std::vector<Number> numbers = {3, 5, 9};
    for (Number target : {8ULL, 10ULL}) {
        KnapsackDecision d = knapsack_from_subset_sum(numbers, target);
        std::cout << "suma de subconjuntos {3, 5, 9} con objetivo " << target << ": mochila dice "
                  << (knapsack_decide(d) ? "sí" : "no") << ", fuerza bruta dice "
                  << (brute_subset_sum(numbers, target) ? "sí" : "no") << '\n';
    }
}
