Skip to content

Commit e2e02d4

Browse files
committed
feat(geektime_algo): add 40 dynamic programming
bag, knapsack, triangle
1 parent 1556c4a commit e2e02d4

File tree

3 files changed

+97
-0
lines changed

3 files changed

+97
-0
lines changed

rust/40_dynamic_programming/bag.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
fn knapsack(items: Vec<i32>, capacity: i32) -> i32 {
2+
let mut states = vec![vec![false; (capacity + 1) as usize]; items.len()];
3+
let mut result = vec![];
4+
states[0][0] = true;
5+
if items[0] <= capacity { states[0][items[0] as usize] = true; }
6+
for i in 1..items.len() {
7+
for j in 0..=capacity as usize {
8+
if states[i-1][j] { states[i][j] = true; }
9+
}
10+
11+
for j in 0..=(capacity - items[i]) as usize {
12+
if states[i-1][j] { states[i][j + items[i] as usize] = true; }
13+
}
14+
}
15+
16+
let mut idx = capacity;
17+
while idx <= capacity {
18+
if states[items.len()-1][idx as usize] { break; }
19+
idx += 1;
20+
}
21+
for i in (1..items.len()).rev() {
22+
if idx - items[i] >= 0 && states[i-1][(idx-items[i]) as usize] {
23+
idx -= items[i];
24+
result.push(items[i]);
25+
}
26+
}
27+
28+
if idx != 0 { result.push(items[0]); }
29+
println!("{:?}", result);
30+
31+
for i in (0..=capacity as usize).rev() {
32+
if states[items.len()-1][i] { return i as i32; }
33+
}
34+
0
35+
}
36+
37+
fn main() {
38+
let items = vec![2, 2, 4, 6, 3];
39+
let capacity = 9;
40+
let m = knapsack(items, capacity);
41+
println!("{}", m);
42+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
fn knapsack(items: Vec<(i32, i32)>, capacity: i32) -> i32 {
2+
let mut states = vec![-1; (capacity + 1) as usize];
3+
let mut result = vec![];
4+
states[0] = 0;
5+
if items[0].0 <= capacity { states[items[0].0 as usize] = items[0].1; }
6+
for i in 1..items.len() {
7+
for j in 0..=(capacity - items[i].0) as usize {
8+
if states[j] >= 0 {
9+
let value = states[j] + items[i].1;
10+
if value > states[j+items[i].0 as usize] {
11+
states[j+items[i].0 as usize] = value;
12+
result.push(items[i].0);
13+
}
14+
}
15+
}
16+
}
17+
18+
let mut max_value = -1;
19+
for i in (0..=capacity as usize).rev() {
20+
if states[i] >= max_value {
21+
max_value = states[i];
22+
}
23+
}
24+
max_value
25+
}
26+
27+
fn main() {
28+
let items = vec![(2, 3), (2, 4), (4, 8), (6, 9), (3, 6)];
29+
let capacity = 9;
30+
let m = knapsack(items, capacity);
31+
println!("{}", m);
32+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# leetcode [minimum_total](https://leetcode.com/problems/triangle/)
2+
3+
pub fn minimum_total(mut triangle: Vec<Vec<i32>>) -> i32 {
4+
if triangle.len() == 0 { return 0; }
5+
6+
for i in (0..triangle.len() - 1).rev() {
7+
for j in 0..triangle[i].len() {
8+
triangle[i][j] = triangle[i+1][j].min(triangle[i+1][j+1]) + triangle[i][j];
9+
}
10+
}
11+
triangle[0][0]
12+
}
13+
14+
fn main() {
15+
let triangle = vec![
16+
vec![2],
17+
vec![3, 4],
18+
vec![6, 5, 7],
19+
vec![4, 1, 8, 3],
20+
];
21+
22+
println!("{:?}", minimum_total(triangle));
23+
}

0 commit comments

Comments
 (0)