Knapsack problem/Continuous: Difference between revisions

Content added Content deleted
m (move to proper position :-()
(→‎{{header|ooRexx}}: add version 2 (simplified from version 1))
Line 1,238: Line 1,238:


=={{header|ooRexx}}==
=={{header|ooRexx}}==
===version 1===
<lang oorexx>/*--------------------------------------------------------------------
<lang oorexx>/*--------------------------------------------------------------------
* 20.09.2014 Walter Pachl translated from REXX version 2
* 20.09.2014 Walter Pachl translated from REXX version 2
Line 1,334: Line 1,335:
-----------------------
-----------------------
total 15.000 349.378</pre>
total 15.000 349.378</pre>
===version 2===
<lang oorexx>/*--------------------------------------------------------------------
* 20.09.2014 Walter Pachl translated from REXX version 2
* utilizing ooRexx features like objects, array(s) and sort
* 21.09.2014 simplified (courtesy Rony Flatscher)
* (sort uses now the methos defined for item)
*-------------------------------------------------------------------*/
maxweight = 15.0
items=.array~new
items~append(.item~new('beef', 3.8, 36.0))
items~append(.item~new('pork', 5.4, 43.0))
items~append(.item~new('ham', 3.6, 90.0))
items~append(.item~new('greaves', 2.4, 45.0))
items~append(.item~new('flitch', 4.0, 30.0))
items~append(.item~new('brawn', 2.5, 56.0))
items~append(.item~new('welt', 3.7, 67.0))
items~append(.item~new('salami', 3.0, 95.0))
items~append(.item~new('sausage', 5.9, 98.0))

/* show the input */
Say '# vpu name weight value'
i=0
Do x over items
i+=1
Say i format(x~vpu,2,3) left(x~name,7) format(x~weight,2,3) format(x~value,3,3)
End

/* sort the items by descending value per unit of weight */
items~sort /* using the method compareTo used for item */

total_weight=0
total_value =0
Say ' '
Say 'Item Weight Value'
i=0
Do x over items
i+=1
Parse Var item.i name '*' weight '*' value
if total_weight+x~weight<maxweight then Do
total_weight = total_weight + x~weight
total_value = total_value + x~value
Say left(x~name,7) format(x~weight,3,3) format(x~value,3,3)
End
Else Do
weight=maxweight-total_weight
value=weight*x~vpu
total_value = total_value + value
total_weight = maxweight
Say left(x~name,7) format(weight,3,3) format(value,3,3)
Leave
End
End
Say copies('-',23)
Say 'total ' format(total_weight,4,3) format(total_value,3,3)
Exit

::class item
::attribute vpu
::attribute name
::attribute weight
::attribute value

::method init
Expose vpu
Use Arg name, weight, value
self~name=name
self~weight=weight
self~value=value
self~vpu=value/weight

::method compareTo -- default sort order
Expose vpu
use Arg other
return -sign(vpu - other~vpu)</lang>
Output is the same as for version 1.


=={{header|Perl}}==
=={{header|Perl}}==