Skip to content

Commit fbe83ba

Browse files
authored
PCL: add knapsack program (#107)
* pcl program for knapsack dp * updated input/result files
1 parent 3299e63 commit fbe83ba

3 files changed

Lines changed: 109 additions & 0 deletions

File tree

pcl/programs/knapsack.input

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../alan/programs/knapsack.input

pcl/programs/knapsack.pcl

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
program knapsack;
2+
(* ============================================================
3+
0/1 Knapsack Problem — Dynamic Programming solution
4+
5+
Input:
6+
N B : number of items, knapsack capacity
7+
p1 p2 … pN : profits
8+
w1 w2 … wN : weights
9+
10+
Output:
11+
Maximum value achievable within capacity B
12+
============================================================ *)
13+
14+
var
15+
N, B : integer;
16+
weight, value : ^array of integer;
17+
dp : ^array of integer;
18+
i, j : integer;
19+
w, v : integer;
20+
take, skip : integer;
21+
22+
(* Compute max of two integers *)
23+
function max (a, b : integer) : integer;
24+
begin
25+
if a > b then
26+
result := a
27+
else
28+
result := b
29+
end;
30+
31+
(* Get dp[i][j] from the 1D dp table *)
32+
function dpGet (i, j : integer) : integer;
33+
begin
34+
result := dp^[i * (B + 1) + j]
35+
end;
36+
37+
(* Set dp[i][j] in the 1D dp table *)
38+
procedure dpSet (i, j, val : integer);
39+
begin
40+
dp^[i * (B + 1) + j] := val
41+
end;
42+
43+
begin
44+
N := readInteger();
45+
B := readInteger();
46+
47+
new [N] weight;
48+
new [N] value;
49+
new [(N + 1) * (B + 1)] dp;
50+
51+
(* Read all profits *)
52+
i := 0;
53+
while i < N do
54+
begin
55+
value^[i] := readInteger();
56+
i := i + 1
57+
end;
58+
59+
(* Read all weights *)
60+
i := 0;
61+
while i < N do
62+
begin
63+
weight^[i] := readInteger();
64+
i := i + 1
65+
end;
66+
67+
(* Base case: dp[0][j] = 0 for all j *)
68+
j := 0;
69+
while j <= B do
70+
begin
71+
dpSet(0, j, 0);
72+
j := j + 1
73+
end;
74+
75+
i := 1;
76+
while i <= N do
77+
begin
78+
w := weight^[i - 1];
79+
v := value^[i - 1];
80+
81+
j := 0;
82+
while j <= B do
83+
begin
84+
(* don't take item i *)
85+
skip := dpGet(i - 1, j);
86+
87+
(* case weight[i-1] > j: dp[i][j] = dp[i-1][j] *)
88+
if w > j then
89+
dpSet(i, j, skip)
90+
else
91+
begin
92+
(* take item i *)
93+
take := dpGet(i - 1, j - w) + v;
94+
dpSet(i, j, max(take, skip))
95+
end;
96+
j := j + 1
97+
end;
98+
i := i + 1
99+
end;
100+
101+
writeInteger(dpGet(N, B));
102+
writeChar("\n");
103+
104+
dispose [] weight;
105+
dispose [] value;
106+
dispose [] dp
107+
end.

pcl/programs/knapsack.result

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../alan/programs/knapsack.result

0 commit comments

Comments
 (0)