Skip to content

Commit ac1dc3b

Browse files
committed
feat(geektime_algo): add 39 back tracking bag_exec
1 parent dcd31b9 commit ac1dc3b

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

rust/39_back_tracking/bag_exec.rs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
use std::collections::HashMap;
2+
3+
fn solve_bag(items: Vec<(i32, i32)>, capacity: i32) -> HashMap<i32, Vec<i32>> {
4+
let pick_idx = 0;
5+
let current_weight = 0;
6+
let mut picks = vec![-1; items.len()];
7+
let mut max_values = vec![-1; items.len()];
8+
let mut result = HashMap::new();
9+
10+
bag(pick_idx,
11+
current_weight,
12+
&items,
13+
capacity,
14+
&mut picks,
15+
&mut max_values,
16+
&mut result,);
17+
18+
result
19+
}
20+
21+
fn bag(pick_idx: i32,
22+
current_weight: i32,
23+
items: &Vec<(i32, i32)>,
24+
capacity: i32,
25+
picks: &mut Vec<i32>,
26+
max_values: &mut Vec<i32>,
27+
result: &mut HashMap<i32, Vec<i32>>) {
28+
if current_weight == capacity || pick_idx == items.len() as i32 {
29+
if get_value(items, &picks) > get_value(items, max_values) {
30+
for i in 0..picks.len() {
31+
max_values[i] = picks[i];
32+
}
33+
result.insert(get_value(items, max_values), picks.to_vec());
34+
}
35+
return;
36+
}
37+
38+
// 选
39+
let item_weight = items[pick_idx as usize].0;
40+
if current_weight + item_weight <= capacity {
41+
picks[pick_idx as usize] = 1;
42+
bag(pick_idx + 1,
43+
current_weight + item_weight,
44+
items,
45+
capacity,
46+
picks,
47+
max_values,
48+
result);
49+
}
50+
51+
// 不选
52+
picks[pick_idx as usize] = 0;
53+
bag(pick_idx + 1,
54+
current_weight,
55+
items,
56+
capacity,
57+
picks,
58+
max_values,
59+
result);
60+
61+
}
62+
63+
fn get_value(items: &Vec<(i32, i32)>, picks: &Vec<i32>) -> i32 {
64+
let mut result = 0;
65+
for i in 0..picks.len() {
66+
if picks[i] == 1 { result += items[i].1; }
67+
}
68+
result
69+
}
70+
71+
fn main() {
72+
// [(weight, value)...]
73+
let items = vec![(3, 5), (2, 2), (1, 4), (1, 2), (4, 10)];
74+
let m = solve_bag(items, 10);
75+
println!("{:?}", m); // {13: [1, 1, 1, 1, 0], 21: [1, 1, 1, 0, 1]}
76+
}

0 commit comments

Comments
 (0)