from typing import Any, Dict, List from common.base_problem import BaseProblem from problems.knapsack.generator import generate_knapsack_case from problems.knapsack.solvers import solve_dp, solve_backtracking from common.timer_utils import time_execution class KnapsackProblem(BaseProblem): def generate_case(self, num_items: int = 10, max_weight: int = 50, max_value: int = 100) -> Dict[str, Any]: return generate_knapsack_case(num_items, max_weight, max_value) def solve(self, input_data: Dict[str, Any], algorithm: str) -> Dict[str, Any]: items = input_data.get("items", []) capacity = input_data.get("capacity", 0) result = None duration = 0.0 if algorithm == "dp": result, duration = time_execution(solve_dp)(items, capacity) elif algorithm == "backtracking": result, duration = time_execution(solve_backtracking)(items, capacity) else: raise ValueError(f"Unknown algorithm: {algorithm}") return { "algorithm": algorithm, "max_value": result["max_value"], "selected_items": result["selected_items"], "time_seconds": duration } def verify(self, input_data: Any, result: Any) -> bool: # Use DP as source of truth items = input_data.get("items", []) capacity = input_data.get("capacity", 0) truth, _ = time_execution(solve_dp)(items, capacity) return result["max_value"] == truth["max_value"]