DryRun
AlgorithmsCourseCompare
DryRun
AlgorithmsCourseCompareGitHubLinkedIn

© 2026 DryRun. Built by Aditya Pandey.

AlgorithmsDynamic ProgrammingSubset Sum (DP)
Dynamic Programmingintermediatedynamic-programmingsubsetpseudo-polynomial

Subset Sum (DP)

DP state dp[i][s] indicates whether sum s is achievable using first i items. Transition: take or skip current element. This converts exponential backtracking to pseudo-polynomial O(nW).

Complexity

Best
O(nW)
Average
O(nW)
Worst
O(nW)
Space
O(nW)

Implementation

bool subsetSumDP(vector<int>& a, int W) {
    int n = a.size();
    vector<vector<bool>> dp(n + 1, vector<bool>(W + 1, false));
    for (int i = 0; i <= n; i++) dp[i][0] = true;
    for (int i = 1; i <= n; i++) {
        for (int s = 1; s <= W; s++) {
            dp[i][s] = dp[i - 1][s];
            if (a[i - 1] <= s) dp[i][s] = dp[i][s] || dp[i - 1][s - a[i - 1]];
        }
    }
    return dp[n][W];
}

How It Works

1.State Meaning

dp[i][s] answers whether sum s is possible using first i numbers.

2.Transition

Skip current item or include it if capacity allows.

3.Pseudo-Polynomial Nature

Depends on numeric sum W, not just input length n.

Related Algorithms

CornerUpLeftSubset SumLayoutGrid0/1 Knapsack

Test Your Knowledge

Quiz coming soon for this algorithm.

Back to all algorithms