Knapsack problem/Continuous: Difference between revisions
Content added Content deleted
(Reformatted Python version) |
(Go solution) |
||
Line 357: | Line 357: | ||
end program KNAPSACK_CONTINUOUS</lang> |
end program KNAPSACK_CONTINUOUS</lang> |
||
=={{header|Go}}== |
|||
<lang go>package main |
|||
import ( |
|||
"fmt" |
|||
"sort" |
|||
) |
|||
type item struct { |
|||
item string |
|||
weight float64 |
|||
price float64 |
|||
} |
|||
type items []item |
|||
var all = items{ |
|||
{"beef", 3.8, 36}, |
|||
{"pork", 5.4, 43}, |
|||
{"ham", 3.6, 90}, |
|||
{"greaves", 2.4, 45}, |
|||
{"flitch", 4.0, 30}, |
|||
{"brawn", 2.5, 56}, |
|||
{"welt", 3.7, 67}, |
|||
{"salami", 3.0, 95}, |
|||
{"sausage", 5.9, 98}, |
|||
} |
|||
// satisfy sort interface |
|||
func (z items) Len() int { return len(z) } |
|||
func (z items) Swap(i, j int) { z[i], z[j] = z[j], z[i] } |
|||
func (z items) Less(i, j int) bool { |
|||
return z[i].price/z[i].weight > z[j].price/z[j].weight |
|||
} |
|||
func main() { |
|||
left := 15. |
|||
sort.Sort(all) |
|||
for _, i := range all { |
|||
if i.weight <= left { |
|||
fmt.Println("take all the", i.item) |
|||
if i.weight == left { |
|||
return |
|||
} |
|||
left -= i.weight |
|||
} else { |
|||
fmt.Printf("take %.1fkg %s\n", left, i.item) |
|||
return |
|||
} |
|||
} |
|||
}</lang> |
|||
Output: |
|||
<pre> |
|||
take all the salami |
|||
take all the ham |
|||
take all the brawn |
|||
take all the greaves |
|||
take 3.5kg welt |
|||
</pre> |
|||
=={{header|Haskell}}== |
=={{header|Haskell}}== |