def unbounded_knapsack(sack_weight_capacity, value_set, weight_set):
    """This is a knapsack with elements that can be repeated.

    So we iterate through every element each time we add a weight/solve for a total_capacity. 
    
    Parameters
    ----------
    sack_weight_capacity : int
    value_set : [int]
    weight_set : [int]

    Raises
    ------
    AssertionError
         If lengths of `value_set` and `weight_set` aren't equal.

    Returns
    -------
    int : The maximum value that can go into the sack under the required weight limit.

    """
    assert len(value_set) == len(weight_set), "The properties of the set must have the same length, you dumb fuck"
    dp_table = [0. for _ in range(sack_weight_capacity + 1)]

    for current_weight in range(1, sack_weight_capacity + 1):
        for element_num in range(len(value_set)):
            if weight_set[element_num] <= current_weight:
                dp_table[current_weight] = max(
                    dp_table[current_weight], 
                    dp_table[current_weight - weight_set[element_num]] + value_set[element_num]
                )
    return dp_table[sack_weight_capacity]