RosettaCodeData/Task/Knapsack-problem-Continuous/Julia/knapsack-problem-continuous-1.julia

33 lines
923 B
Text
Raw Permalink Normal View History

2020-02-17 23:21:07 -08:00
using Printf
2018-06-22 20:57:24 +00:00
struct KPCSupply{T<:Real}
item::String
2015-11-18 06:14:39 +00:00
weight::T
value::T
uvalue::T
end
2018-06-22 20:57:24 +00:00
function KPCSupply(item::AbstractString, weight::Real, value::Real)
w, v = promote(weight, value)
KPCSupply(item, w, v, v / w)
2015-11-18 06:14:39 +00:00
end
2018-06-22 20:57:24 +00:00
Base.show(io::IO, s::KPCSupply) = print(io, s.item, @sprintf " (%.2f kg, %.2f €, %.2f €/kg)" s.weight s.value s.uvalue)
Base.isless(a::KPCSupply, b::KPCSupply) = a.uvalue < b.uvalue
function solve(store::Vector{KPCSupply{T}}, capacity::Real) where T<:Real
sack = similar(store, 0) # vector like store, but of length 0
2015-11-18 06:14:39 +00:00
kweight = zero(T)
2018-06-22 20:57:24 +00:00
for s in sort(store, rev = true)
if kweight + s.weight ≤ capacity
2015-11-18 06:14:39 +00:00
kweight += s.weight
2018-06-22 20:57:24 +00:00
push!(sack, s)
2015-11-18 06:14:39 +00:00
else
2018-06-22 20:57:24 +00:00
w = capacity - kweight
v = w * s.uvalue
push!(sack, KPCSupply(s.item, w, v, s.value))
2015-11-18 06:14:39 +00:00
break
end
end
2018-06-22 20:57:24 +00:00
return sack
2015-11-18 06:14:39 +00:00
end