Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
|
|
@ -0,0 +1,42 @@
|
|||
/*REXX pgm solves the continuous burglar's knapsack problem; items with weight and value*/
|
||||
@.= /*═══════ name weight value ══════*/
|
||||
@.1 = 'flitch 4 30 '
|
||||
@.2 = 'beef 3.8 36 '
|
||||
@.3 = 'pork 5.4 43 '
|
||||
@.4 = 'greaves 2.4 45 '
|
||||
@.5 = 'brawn 2.5 56 '
|
||||
@.6 = 'welt 3.7 67 '
|
||||
@.7 = 'ham 3.6 90 '
|
||||
@.8 = 'salami 3 95 '
|
||||
@.9 = 'sausage 5.9 98 '
|
||||
parse arg maxW d . /*get possible arguments from the C.L. */
|
||||
if maxW=='' | maxW=="," then maxW=15 /*the burglar's knapsack maximum weight*/
|
||||
if d=='' | d=="," then d= 3 /*# decimal digits shown with FORMAT. */
|
||||
wL=d+length('weight'); nL=d+length("total weight"); vL=d+length('value') /*lengths*/
|
||||
totW=0; totV=0 /* [↓] assign item to separate lists. */
|
||||
do #=1 while @.#\==''; parse var @.# n.# w.# v.# .; end; #=#-1
|
||||
call show 'unsorted item list' /*display the header and the @ list.*/
|
||||
call sortD /*invoke descemdomg sort for: n. w. v.*/
|
||||
call hdr "burglar's knapsack contents"
|
||||
do j=1 for # while totW<maxW; f=1 /*process the items. */
|
||||
if totW+w.j>=maxW then f=(maxW-totW)/w.j /*calculate fraction. */
|
||||
totW=totW+w.j*f; totV=totV+v.j*f /*add it ───► totals. */
|
||||
call syf left(word('{all}',1+(f\==1)),5) n.j, w.j*f, v.j*f
|
||||
end /*j*/ /* [↑] display item, maybe with {all} */
|
||||
call sep; say /* [↓] $ suppresses trailing zeroes.*/
|
||||
call sy left('total weight', nL, "─"), $(format(totW,,d))
|
||||
call sy left('total value', nL, "─"), , $(format(totV,,d))
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
sortD: do s=2 to #; a=n.s; !=w.s; u=v.s /* [↓] this is a descending sort. */
|
||||
do k=s-1 by -1 to 1 while v.k/w.k<u/!; ?=k+1; n.?=n.k; w.?=w.k; v.?=v.k; end
|
||||
?=k+1; n.?=a; w.?=!; v.?=u
|
||||
end /*s*/; return /* ↑↑↑ algorithm is OK for small arrays*/
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
hdr: say; say; say center(arg(1),50,'─'); say; call title; call sep; return
|
||||
sep: call sy copies('═', nL), copies("═", wL), copies('═', vL); return
|
||||
show: call hdr arg(1); do j=1 for #; call syf n.j, w.j, v.j; end; return
|
||||
sy: say left('',9) left(arg(1),nL) right(arg(2),wL) right(arg(3),vL); return
|
||||
syf: call sy arg(1), $(format(arg(2), , d)), $(format(arg(3), , d)); return
|
||||
title: call sy center('item',nL), center("weight", wL), center('value', vL); return
|
||||
$: parse arg x;if pos(.,x)>1 then x=left(strip(strip(x,'T',0),,.),length(x)); return x
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
/*--------------------------------------------------------------------
|
||||
* 19.09.2014 Walter Pachl translated from FORTRAN
|
||||
* While this program works with all REXX interpreters,
|
||||
* see section ooRexx for a version that utilizes the ooRexx features
|
||||
*-------------------------------------------------------------------*/
|
||||
maxweight = 15.0
|
||||
input.0=0
|
||||
Call init_input 'beef', 3.8, 36.0
|
||||
Call init_input 'pork', 5.4, 43.0
|
||||
Call init_input 'ham', 3.6, 90.0
|
||||
Call init_input 'greaves', 2.4, 45.0
|
||||
Call init_input 'flitch', 4.0, 30.0
|
||||
Call init_input 'brawn', 2.5, 56.0
|
||||
Call init_input 'welt', 3.7, 67.0
|
||||
Call init_input 'salami', 3.0, 95.0
|
||||
Call init_input 'sausage', 5.9, 98.0
|
||||
|
||||
/* sort the items by descending value per unit of weight */
|
||||
Do i = 1 to input.0
|
||||
Parse Var input.i name '*' weight '*' value
|
||||
vpu=value/weight;
|
||||
If i=1 Then Do
|
||||
item.0=1
|
||||
item.1=input.1
|
||||
vpu.1=vpu
|
||||
End
|
||||
Else Do
|
||||
Do ii=1 To item.0
|
||||
If vpu.ii<vpu Then
|
||||
Leave
|
||||
End
|
||||
Do jj=item.0 To ii By -1
|
||||
jj1=jj+1
|
||||
item.jj1=item.jj
|
||||
vpu.jj1=vpu.jj
|
||||
End
|
||||
item.ii=input.i
|
||||
vpu.ii=vpu
|
||||
item.0=item.0+1
|
||||
End
|
||||
End
|
||||
Say '# vpu name weight value'
|
||||
Do i=1 To item.0
|
||||
Parse Var item.i name '*' weight '*' value
|
||||
Say i format(vpu.i,2,3) left(name,7) format(weight,2,3) format(value,3,3)
|
||||
End
|
||||
|
||||
total_weight=0
|
||||
total_value =0
|
||||
Say ' '
|
||||
Say 'Item Weight Value'
|
||||
Do i=1 To item.0
|
||||
Parse Var item.i name '*' weight '*' value
|
||||
if total_weight+weight < maxweight then Do
|
||||
total_weight = total_weight + weight
|
||||
total_value = total_value + value
|
||||
Say left(name,7) format(weight,3,3) format(value,3,3)
|
||||
End
|
||||
Else Do
|
||||
weight=maxweight-total_weight
|
||||
value=weight*vpu.i
|
||||
total_value = total_value + value
|
||||
total_weight = maxweight
|
||||
Say left(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
|
||||
|
||||
init_input: Procedure Expose input.
|
||||
Parse Arg name,weight,value
|
||||
i=input.0+1
|
||||
input.i=name'*'weight'*'value
|
||||
input.0=i
|
||||
Return
|
||||
Loading…
Add table
Add a link
Reference in a new issue