Finish course 3 week 4 knapsack assignment
This commit is contained in:
101
data/c3a4_knapsack1.txt
Normal file
101
data/c3a4_knapsack1.txt
Normal 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
2001
data/c3a4_knapsack_big.txt
Normal file
File diff suppressed because it is too large
Load Diff
33
src/knapsack.rs
Normal file
33
src/knapsack.rs
Normal 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()
|
||||
}
|
||||
19
src/main.rs
19
src/main.rs
@@ -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();
|
||||
}
|
||||
|
||||
29
src/util.rs
29
src/util.rs
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user