Finish course 3 week 4 knapsack assignment

This commit is contained in:
2021-02-15 18:55:09 -05:00
parent f702a6fc99
commit 82cbb528b1
5 changed files with 2181 additions and 2 deletions

101
data/c3a4_knapsack1.txt Normal file
View File

@@ -0,0 +1,101 @@
10000 100
16808 250
50074 659
8931 273
27545 879
77924 710
64441 166
84493 43
7988 504
82328 730
78841 613
44304 170
17710 158
29561 934
93100 279
51817 336
99098 827
13513 268
23811 634
80980 150
36580 822
11968 673
1394 337
25486 746
25229 92
40195 358
35002 154
16709 945
15669 491
88125 197
9531 904
27723 667
28550 25
97802 854
40978 409
8229 934
60299 982
28636 14
23866 815
39064 537
39426 670
24116 95
75630 502
46518 196
30106 405
19452 299
82189 124
99506 883
6753 567
36717 338
54439 145
51502 898
83872 829
11138 359
53178 398
22295 905
21610 232
59746 176
53636 299
98143 400
27969 413
261 558
41595 9
16396 969
19114 531
71007 963
97943 366
42083 853
30768 822
85696 713
73672 902
48591 832
14739 58
31617 791
55641 680
37336 7
97973 99
49096 320
83455 224
12290 761
48906 127
36124 507
45814 771
35239 95
96221 845
12367 535
25227 395
41364 739
7845 591
36551 160
8624 948
97386 218
95273 540
99248 386
13497 886
40624 421
28145 969
35736 916
61626 535
46043 12
54680 153

2001
data/c3a4_knapsack_big.txt Normal file

File diff suppressed because it is too large Load Diff

33
src/knapsack.rs Normal file
View File

@@ -0,0 +1,33 @@
#[derive(Debug)]
pub struct Knapsack {
pub size: usize,
pub n_items: usize,
pub items: Vec<Item>,
}
#[derive(Debug)]
pub struct Item {
pub value: usize,
pub weight: usize,
}
pub fn knapsack(k: &Knapsack) -> usize {
let mut weight_to_value = vec![0; k.size];
for item_index in 0..k.n_items {
let mut new_weight_to_value = weight_to_value.to_vec();
let item = &k.items[item_index];
for weight in 0..k.size {
if weight >= item.weight {
let current_value = weight_to_value[weight];
let new_value = weight_to_value[weight - item.weight] + item.value;
if new_value > current_value {
new_weight_to_value[weight] = new_value;
}
}
}
weight_to_value = new_weight_to_value;
}
weight_to_value.pop().unwrap()
}

View File

@@ -12,6 +12,7 @@ mod quick_sort;
mod ssc;
mod two_sum;
mod util;
mod knapsack;
use crate::dijkstra::dijkstra;
use crate::heap::heap;
@@ -25,6 +26,7 @@ use crate::quick_sort::quick_sort;
use crate::ssc::ssc;
use crate::two_sum::find_two_sums;
use crate::mwis::mwis;
use crate::knapsack::knapsack;
use std::cmp::min;
#[allow(dead_code)]
@@ -126,11 +128,23 @@ fn c3a3() {
let s = util::read_max_weight_set("data/c3a3_mwis.txt").unwrap();
let r3 = mwis(&s);
println!("r1 = {} r2 = {} r3 = {:?}", r.1, r.0, r3);
// r1 = 19 r2 = 9 r3 = [1, 0, 1, 0, 0, 1, 1, 0]
}
#[allow(dead_code)]
fn c3a4() {
println!("continue here");
let k1 = util::read_knapsack("data/c3a4_knapsack1.txt").unwrap();
let r1 = knapsack::knapsack(&k1);
let k2 = util::read_knapsack("data/c3a4_knapsack_big.txt").unwrap();
let r2 = knapsack::knapsack(&k2);
println!("r1 = {} r2 = {}", r1, r2);
// r1 = 2493893 r2 = 4243395
}
#[allow(dead_code)]
fn c4a4() {
println!("Final course!");
}
fn main() {
@@ -143,6 +157,7 @@ fn main() {
// c2a4();
// c3a1();
// c3a2();
c3a3();
// c3a3();
c3a4();
c4a4();
}

View File

@@ -6,6 +6,7 @@ use crate::min_cut;
use crate::prims;
use crate::ssc;
use crate::mwis;
use crate::knapsack;
use std::fs::File;
use std::io;
use std::io::{BufRead, BufReader, Error, ErrorKind};
@@ -281,3 +282,31 @@ pub fn read_max_weight_set(path: &str) -> Result<mwis::IndependentSet, io::Error
assert!(length == s.weights.len());
Ok(s)
}
pub fn read_knapsack(path: &str) -> Result<knapsack::Knapsack, io::Error> {
let file = File::open(path)?;
let mut lines = BufReader::new(file).lines();
let line = lines.next().unwrap().unwrap();
let mut fields = line.split_whitespace();
let knapsack_size = fields.next().unwrap().parse().unwrap();
let number_of_items = fields.next().unwrap().parse().unwrap();
let mut k = knapsack::Knapsack {
size: knapsack_size,
n_items: number_of_items,
items: Vec::new(),
};
for line in lines {
let line = line?;
let mut fields = line.split_whitespace();
let value = fields.next().unwrap().parse().unwrap();
let weight = fields.next().unwrap().parse().unwrap();
let item = knapsack::Item {
value: value,
weight: weight,
};
k.items.push(item);
}
Ok(k)
}