DEV Community

Cover image for Knapsack Variation
Santhosh Balasa
Santhosh Balasa

Posted on Edited on

Knapsack Variation

An investor has saved some money and wants to invest in the stock market. There are a number of stocks to choose from, and they want to buy at most 1 share in any company. The total invested cannot exceed the funds available. A friend who is a stock market expert has predicted the value of each stock after 1 year.
Determine the maximum profit that can be earned at the end of the year assuming the predictions come true.

In Python

def knapsack(w, v, W, n, t):
    if n == 0 or W == 0:
        return 0
    if t[n][W] != -1:
        return t[n][W]
    if w[n - 1] <= W:
        t[n][W] = max(
            v[n - 1] + knapsack(w, v, W - w[n - 1], n - 1, t),
            knapsack(w, v, W, n - 1, t),
        )
    else:
        t[n][W] = knapsack(w, v, W, n - 1, t)
    return t[n][W]


def main():
    saving = 250
    current_value = [175, 133, 109, 201, 97]
    future_value = [200, 125, 128, 228, 133]

    # This is a 0/1 knapsack based algorithm
    t = [[-1 for i in range(1000)] for j in range(saving)]  # n x W matrix

    profits = [
        0 if j < j else j - i for i, j in zip(current_value, future_value)
    ]
    print(knapsack(current_value, profits, saving, len(current_value), t))


if __name__ == "__main__":
    main()
Enter fullscreen mode Exit fullscreen mode

In Rust

use std::cmp;

fn knapsack(w: &Vec<i32>, v: &Vec<i32>, W: i32, n: usize, t: &mut Vec<Vec<i32>>) -> i32 {
    if n == 0 || W == 0 {
        return 0;
    }
    if t[n][W as usize] != -1 {
        return t[n][W as usize];
    }
    if w[n - 1] <= W {
        t[n][W as usize] = cmp::max(
            v[n - 1] + knapsack(w, v, W - w[n - 1], n - 1, t),
            knapsack(w, v, W, n - 1, t),
        );
    } else {
        t[n][W as usize] = knapsack(w, v, W, n - 1, t);
    }
    return t[n][W as usize];
}

fn main() {
    let saving: i32 = 250;
    let current_value = vec![175, 133, 109, 201, 97];
    let future_value = vec![200, 125, 128, 228, 133];
    let mut t = vec![vec![-1; 1000]; saving as usize + 1]; // (n+1) x W matrix

    let mut profits = Vec::new();
    for (i, j) in current_value.iter().zip(future_value.iter()) {
        profits.push(if j < i { 0 } else { j - i });
    }
    println!(
        "{}",
        knapsack(
            &current_value,
            &profits,
            saving,
            current_value.len(),
            &mut t
        )
    );
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)