use lpsolve::prelude::*;
fn main() -> Result<()> {
println!("=== Knapsack Problem (Integer Programming) ===\n");
let items = vec![
("Book", 4.0, 10.0),
("Laptop", 7.0, 15.0),
("Water", 3.0, 8.0),
("Snacks", 2.0, 6.0),
("Camera", 5.0, 12.0),
];
let n = items.len();
let capacity = 15.0;
let values: Vec<f64> = items.iter().map(|(_, _, v)| *v).collect();
let weights: Vec<f64> = items.iter().map(|(_, w, _)| *w).collect();
let names: Vec<&str> = items.iter().map(|(n, _, _)| *n).collect();
let solution = Problem::builder()
.name("Knapsack Problem")?
.cols(n as i32)
.max(&values)
.le(&weights, capacity)
.binary_vars(&(1..=n as i32).collect::<Vec<_>>()) .variable_names(&names)?
.typical_mip()
.solve()?;
if solution.is_optimal() {
println!("✓ Found optimal solution!");
println!(" Total value: {:.2}", solution.objective_value());
println!("\n Items to take:");
let mut total_weight = 0.0;
for (i, (name, weight, value)) in items.iter().enumerate() {
if let Some(take) = solution.variable((i + 1) as i32) {
if take > 0.5 { println!(" ✓ {} (weight: {}, value: {})", name, weight, value);
total_weight += weight;
}
}
}
println!("\n Total weight used: {:.2}/{:.2}", total_weight, capacity);
println!(" Nodes explored: {}", solution.nodes());
println!(" Time elapsed: {:.4}s", solution.time_elapsed());
} else {
println!("✗ Problem status: {:?}", solution.status());
}
Ok(())
}