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 ssc;
|
||||||
mod two_sum;
|
mod two_sum;
|
||||||
mod util;
|
mod util;
|
||||||
|
mod knapsack;
|
||||||
|
|
||||||
use crate::dijkstra::dijkstra;
|
use crate::dijkstra::dijkstra;
|
||||||
use crate::heap::heap;
|
use crate::heap::heap;
|
||||||
@@ -25,6 +26,7 @@ use crate::quick_sort::quick_sort;
|
|||||||
use crate::ssc::ssc;
|
use crate::ssc::ssc;
|
||||||
use crate::two_sum::find_two_sums;
|
use crate::two_sum::find_two_sums;
|
||||||
use crate::mwis::mwis;
|
use crate::mwis::mwis;
|
||||||
|
use crate::knapsack::knapsack;
|
||||||
use std::cmp::min;
|
use std::cmp::min;
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
@@ -126,11 +128,23 @@ fn c3a3() {
|
|||||||
let s = util::read_max_weight_set("data/c3a3_mwis.txt").unwrap();
|
let s = util::read_max_weight_set("data/c3a3_mwis.txt").unwrap();
|
||||||
let r3 = mwis(&s);
|
let r3 = mwis(&s);
|
||||||
println!("r1 = {} r2 = {} r3 = {:?}", r.1, r.0, r3);
|
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)]
|
#[allow(dead_code)]
|
||||||
fn c3a4() {
|
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() {
|
fn main() {
|
||||||
@@ -143,6 +157,7 @@ fn main() {
|
|||||||
// c2a4();
|
// c2a4();
|
||||||
// c3a1();
|
// c3a1();
|
||||||
// c3a2();
|
// c3a2();
|
||||||
c3a3();
|
// c3a3();
|
||||||
c3a4();
|
c3a4();
|
||||||
|
c4a4();
|
||||||
}
|
}
|
||||||
|
|||||||
29
src/util.rs
29
src/util.rs
@@ -6,6 +6,7 @@ use crate::min_cut;
|
|||||||
use crate::prims;
|
use crate::prims;
|
||||||
use crate::ssc;
|
use crate::ssc;
|
||||||
use crate::mwis;
|
use crate::mwis;
|
||||||
|
use crate::knapsack;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::io::{BufRead, BufReader, Error, ErrorKind};
|
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());
|
assert!(length == s.weights.len());
|
||||||
Ok(s)
|
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