Advertisement
Guest User

Untitled

a guest
May 21st, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.18 KB | None | 0 0
  1. use std::collections::{HashMap as Map, HashSet as Set};
  2.  
  3. #[derive(Clone, Debug, PartialEq, Eq, Hash)]
  4. struct Combo {
  5. items: Vec<String>,
  6. }
  7.  
  8. impl Combo {
  9. pub fn from_item(item: &str) -> Self {
  10. Self {
  11. items: vec![item.into()],
  12. }
  13. }
  14. pub fn add_item(&self, item: &str) -> Self {
  15. let mut modified = self.clone();
  16. modified.items.push(item.into());
  17. modified.items.sort();
  18. modified
  19. }
  20. }
  21.  
  22. fn find_combos_inner(sorted_menu: &[(&str, f64)], target_price: f64, first_index: usize) -> Set<Combo> {
  23. let mut combos: Set<Combo> = Set::new();
  24. for (index, (item, price)) in sorted_menu[first_index..].iter().enumerate() {
  25. if *price > target_price {
  26. continue;
  27. } else if *price == target_price {
  28. let combo = Combo::from_item(item);
  29. combos.insert(combo);
  30. } else {
  31. let sub_combos = find_combos_inner(&sorted_menu, target_price - *price, index);
  32. for sub_combo in sub_combos {
  33. let combo = sub_combo.add_item(item);
  34. combos.insert(combo);
  35. }
  36. }
  37. }
  38. combos
  39. }
  40.  
  41. fn find_combos(menu: &Map<&str, f64>, target_price: f64) -> Set<Combo> {
  42. let mut sorted_menu: Vec<(&str, f64)> = menu.clone().into_iter().collect();
  43. sorted_menu.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap());
  44. find_combos_inner(&sorted_menu, target_price, 0)
  45. }
  46.  
  47. fn main() {
  48. let mut menu = Map::new();
  49. menu.insert("fries", 2.50);
  50. menu.insert("burger", 5.00);
  51. menu.insert("soda", 1.00);
  52. menu.insert("ice cream", 3.00);
  53. menu.insert("pickle", 0.50);
  54. menu.insert("chips", 1.20);
  55. menu.insert("candy bar", 1.10);
  56. menu.insert("onion rings", 3.00);
  57. menu.insert("curly fries", 2.75);
  58. menu.insert("candy corn", 1.60);
  59. // menu.insert("peanuts", 0.30);
  60. menu.insert("hot dog", 1.50);
  61. menu.insert("chili dog", 2.50);
  62. let target_price = 7.50;
  63. println!("Menu: {:#?}", &menu);
  64. println!("Target price: {}", target_price);
  65. println!("Solving...");
  66. let combos = find_combos(&menu, target_price);
  67. println!("# of possible combos: {}", combos.len());
  68. println!("All possible combos: {:#?}", &combos);
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement