2 Replies Latest reply on Jun 10, 2016 3:43 AM by alexh90310518

# A Knapsack problem

Hello,

So I've been given something a little out of my depth the chew on.

I have a knapsack problem style idea for the document I'm working on and I have been given a "sort of half" solution for it written in VB.

I've never used VB before so I have done my best at translating it into JavaScript, I'll post the 2 for comparison below.

What I'm trying to achieve is when someone types in a number, say, 120 into a text field it calculates exactly how many of the 4 items, 50, 35 20 and 15 it would require to make this value in as little as possible then display the results accordingly on the screen. It would also tell the person if that amount was impossible to create using those 4 values. e.g 115 would be possible via (50 x 2) + 15 and 25 is impossible to combine.

Here is the original VB script;

```Function calc(Target) As String
Dim Counts(1 To 4) As Integer
Dim addOns(1 To 4) As Integer
Dim remainder As Integer
Dim lastMatch As Integer
Dim loopy As Integer
Dim failed As Boolean

Counts(1) = 0
Counts(2) = 0
Counts(3) = 0
Counts(4) = 0

remainder = Target
lastMatch = 0
loopy = 1

While remainder <> 0 And Not ((failed) And (loopy <> 4))
While ((loopy < 5) And (remainder > 0))
failed = True
Counts(loopy) = Counts(loopy) + 1
failed = False
lastMatch = loopy
Else
loopy = loopy + 1
End If
Wend
If ((failed) And (remainder <> 0)) Then
Counts(lastMatch) = Counts(lastMatch) - 1
loopy = lastMatch + 1
lastMatch = 0
failed = False
End If
Wend
If (failed And (loopy = 4)) Then
ErrorMsg = "Error: " & Target & " Not Matched - "
Else
ErrorMsg = "Matched: " & Target & " - "
End If

calc = ErrorMsg & "50=" & Counts(1) & ": 35=" & Counts(2) & ": 20=" & Counts(3) & ": 15=" & Counts(4)

End Function
```

And here is my attempt at translating it into JavaScript

```function KnapCalc (FieldTxt) {
50, 35, 20, 15];
var counts = [
0, 0, 0, 0];

var remainder = target;
var target = this.getField(FieldTxt);
var lastMatch = 0;
var loopy = 1;
var failed = true;

while (remainder !== 0 && failed == true && loopy !== 4) {
while (loopy < 5 && remainder > 0) {
if (remainder >= addOns[loopy] + 1) {
counts[loopy] = counts[loopy];
failed.value = false;
lastMatch = loopy;
}
else {
loopy = loopy + 1;
}
}
if (failed == true && remainder !== 0) {
counts[lastMatch] = counts[lastMatch] - 1;
loopy = lastMatch + 1;
lastMatch = 0
failed.value = false;
}
}
if (failed == true) {
app.alert("Error: " + target + " Not Matched - " + addOnCalc);
}
else {
}
var addOnCalc = "50 = " + counts[1] + "35 = " + counts [2] + "20 = " + counts[3] +
"15 = " + counts[4];
}
```

I think this conversion works and I am also sure that it gets stuck into an infinite loop when the program is required to step back more that once as acrobat seizes up and then crashes when I pass the textfield target the value of 120.

As I mentioned I'm out of my depth with this and could use some help.

Any help is much appreciated

• ###### 1. Re: A Knapsack problem

A couple of thoughts

1. Both codes seem, on a quick review, to show a design problem, in that if the remainder after the inner loop is less than zero or the input is more than 120, the outer loop will never exit.

2. Arrays in JavaScript are always zero-based (first element is array[0])