# Dynamic Programming – 3 : Subset Sum

February 3, 2011 Leave a comment

**Subset Sum **

We are given items , each having non-negative integral weight . We are also given a non-negative integral weight bound . Our task is to find a valid subset of items which maximizes the total weight of the items in the subset.

Terminology: A valid subset is one such that the total weight of items in is at most .

**Solution. **

For item , we have 2 choices : either to include it in the optimum solution, or to not include it.(Note that if , then we have just one choice — exclude from the optimum solution.)

**Case 1: **

If is included in the optimum solution, the optimum solution would be plus the optimum solution obtained from the set of items with the weight bound as .

**Notation: **Let OPT (i, w) denote the value of the optimum solution obtained on the set with weight bound .The original task, then, is to compute .

We have that, if is included in the optimum solution,

.

**Case 2: **

If is not included in the optimum solution, then we have that:

.

—-

Generalizing the above, we have that, for and :

[if ]

Else,

—-

Also, for all .

—-

**Pseudocode for computing the optimum value: **

Based on the above recurrence, we can construct an algorithm.

**For i from 1 to n: **

**For w from 0 to W:**

**Compute OPT[i,w] using the above recurrence. **

**End. **

**—-**

The above code runs in time [since O(1) time is spent for computing each OPT[i,w] value].

—-

**Computing the Optimum solution: **

We can compute the optimum solution recursively given the table of OPT[i,w] values.

**Function: Print_OPT (k, w) **

**If **

**Return; //Breaking the recursion. We can also have the condition as ** OR

**If **

**Print_OPT (k-1, w); **

**Else if **

**Print_OPT (k-1, w- w_k); **

**Print **

**Else **

**Print_OPT (k-1, w); **

**End of function. **

**— **

The optimum solution is printed on calling Print_OPT (n, W). The time taken is O(n).

—-