Bird
Raised Fist0
DSA Cprogramming~10 mins

Generate All Combinations Sum K in DSA C - Execution Trace

Choose your learning style10 modes available
Concept Flow - Generate All Combinations Sum K
Start with empty combination
↓
Choose next number from candidates
↓
Add number to current combination
↓
Check sum of combination
↓
Save combination
↓
Backtrack: remove last number
↓
Try next candidate
↓
End when all candidates tried or sum > K
Start with an empty list, pick numbers one by one, add them if sum is less than or equal to K, save if sum equals K, backtrack to try other numbers.
Execution Sample
DSA C
void backtrack(int start, int sum, int k, int* comb, int combSize) {
  if (sum == k) { /* print_comb(comb, combSize); */ return; }
  for (int i = start; i < n; i++) {
    if (sum + candidates[i] <= k) {
      comb[combSize] = candidates[i];
      backtrack(i, sum + candidates[i], k, comb, combSize + 1);
    }
  }
}
Recursively build combinations by adding candidates while sum does not exceed K, print when sum equals K.
Execution Table
StepOperationCurrent CombinationSumActionVisual State
1Start[]0Begin with empty combination[]
2Add 1[1]1Sum < K, recurse deeper[1]
3Add 1[1,1]2Sum < K, recurse deeper[1 -> 1]
4Add 1[1,1,1]3Sum == K, save combination[1 -> 1 -> 1]
5Backtrack[1,1]2Remove last 1, try next candidate[1 -> 1]
6Add 2[1,1,2]4Sum > K, skip[1 -> 1]
7Backtrack[1]1Remove last 1, try next candidate[1]
8Add 2[1,2]3Sum == K, save combination[1 -> 2]
9Backtrack[1]1Remove last 2, try next candidate[1]
10Add 3[1,3]4Sum > K, skip[1]
11Backtrack[]0Remove last 1, try next candidate[]
12Add 2[2]2Sum < K, recurse deeper[2]
13Add 2[2,2]4Sum > K, skip[2]
14Add 3[2,3]5Sum > K, skip[2]
15Backtrack[]0Remove last 2, try next candidate[]
16Add 3[3]3Sum == K, save combination[3]
17Backtrack[]0All candidates tried, end[]
💡 All candidates tried or sum exceeded K, recursion ends
Variable Tracker
VariableStartAfter Step 2After Step 4After Step 8After Step 12After Step 16Final
combination[][1][1,1,1][1,2][2][3][]
sum0133230
step1248121617
Key Moments - 3 Insights
Why do we backtrack after reaching sum == K?
Because after saving a valid combination (step 4), we remove the last number to try other possibilities (step 5), as shown in the execution_table.
Why do we skip adding a number when sum + candidate > K?
To avoid invalid combinations exceeding K, the code skips adding that candidate (step 6), preventing unnecessary recursion.
Why do we start the next recursion from the current index, not zero?
Starting from current index (not zero) avoids duplicates and allows repeated use of the same number, as seen in steps 2 and 3.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 4, what is the current combination?
A[1,1,1]
B[1,2]
C[2,3]
D[3]
💡 Hint
Check the 'Current Combination' column at step 4 in the execution_table.
At which step does the sum first equal K?
AStep 2
BStep 4
CStep 8
DStep 12
💡 Hint
Look at the 'Sum' and 'Action' columns in the execution_table to find when sum == K.
If we change K to 4, which step would change in the execution_table?
AStep 4 would no longer save combination
BStep 8 would save combination with sum 4
CStep 16 would save combination with sum 4
DStep 6 would add a new candidate
💡 Hint
Check which sums equal K in the execution_table and how changing K affects saving combinations.
Concept Snapshot
Generate All Combinations Sum K:
- Use backtracking to build combinations
- Add candidates while sum ≤ K
- Save combination when sum == K
- Backtrack to try other candidates
- Avoid duplicates by starting from current index
- Stop recursion when sum > K
Full Transcript
This concept shows how to generate all combinations of numbers that add up to a target sum K. We start with an empty list and add numbers one by one from the candidates. If the sum equals K, we save the combination. If the sum is less than K, we continue adding numbers recursively. If the sum exceeds K, we stop and backtrack to try other numbers. We avoid duplicates by always starting the next recursion from the current candidate index. The execution table traces each step, showing the current combination, sum, and actions taken. Key moments explain why backtracking is needed and why we skip candidates that exceed the sum. The visual quiz tests understanding of the combination states and recursion flow.

Practice

(1/5)
1. What is the main goal of the Generate All Combinations Sum K problem?
easy
A. Count the total number of elements in an array
B. Sort an array of numbers in ascending order
C. Find the maximum number in an array
D. Find all unique combinations of numbers that add up to a target sum K

Solution

  1. Step 1: Understand the problem statement

    The problem asks to find all unique sets of numbers that add up exactly to a given sum K.
  2. Step 2: Identify the goal

    The goal is to generate all possible combinations, not just one or count elements.
  3. Final Answer:

    Find all unique combinations of numbers that add up to a target sum K -> Option D
  4. Quick Check:

    Combination sum = find all sets adding to K [OK]
Hint: Focus on combinations that sum exactly to K [OK]
Common Mistakes:
  • Confusing combination sum with sorting
  • Looking for maximum instead of combinations
  • Counting elements instead of sums
2. Which of the following is the correct way to start a recursive function header in C for generating combinations that sum to K from an array arr of size n?
easy
A. void generate(int arr[], int n, int target, int start, int currentSum, int combination[], int combSize)
B. int generate(int arr, int n, int target, int start, int currentSum, int combination[], int combSize)
C. void generate(int arr, int n, int target, int start, int currentSum, int combination[], int combSize)
D. int generate(int arr[], int n, int target, int start, int currentSum, int combination[], int combSize)

Solution

  1. Step 1: Check parameter types for array and function return

    In C, arrays are passed as int arr[] and recursive functions for generating combinations usually return void.
  2. Step 2: Verify function signature correctness

    void generate(int arr[], int n, int target, int start, int currentSum, int combination[], int combSize) correctly uses void return type and int arr[] for the array parameter.
  3. Final Answer:

    void generate(int arr[], int n, int target, int start, int currentSum, int combination[], int combSize) -> Option A
  4. Quick Check:

    Correct C syntax for recursive combination function [OK]
Hint: Use void return and array as int arr[] in C [OK]
Common Mistakes:
  • Using int instead of int[] for array parameter
  • Returning int instead of void for recursive function
  • Missing array brackets in parameter
3. What will be the output combinations for the array [2, 3, 6, 7] and target sum 7 using combination sum logic?
medium
A. [[7], [2, 2, 3]]
B. [[7], [3, 4]]
C. [[2, 3, 6], [7]]
D. [[2, 2, 3], [6, 1]]

Solution

  1. Step 1: Identify valid combinations summing to 7

    From the array, 7 alone is valid. Also, 2+2+3 = 7 is valid. 3+4 is invalid as 4 is not in array. 6+1 invalid as 1 not in array.
  2. Step 2: Confirm combinations

    Valid combinations are [7] and [2, 2, 3].
  3. Final Answer:

    [[7], [2, 2, 3]] -> Option A
  4. Quick Check:

    Sum 7 from array = [7], [2,2,3] [OK]
Hint: Check sums only from given array elements [OK]
Common Mistakes:
  • Including numbers not in the array
  • Ignoring repeated elements allowed
  • Mixing invalid sums
4. Given the following snippet, what is the bug that prevents correct generation of combinations summing to K?
void generate(int arr[], int n, int target, int start, int currentSum, int combination[], int combSize) {
    if (currentSum == target) {
        // print combination
        return;
    }
    for (int i = start; i < n; i++) {
        if (currentSum + arr[i] <= target) {
            combination[combSize] = arr[i];
            generate(arr, n, target, i, currentSum + arr[i], combination, combSize + 1);
        }
    }
}
medium
A. Incorrect base case condition for currentSum == target
B. Loop should start from 0 instead of start
C. Missing backtracking step to remove last element after recursion
D. Function should return int instead of void

Solution

  1. Step 1: Analyze recursion and combination building

    The function adds elements to combination but never removes them after recursion, causing incorrect combinations.
  2. Step 2: Identify missing backtracking

    Backtracking requires removing last added element after recursive call to explore other paths.
  3. Final Answer:

    Missing backtracking step to remove last element after recursion -> Option C
  4. Quick Check:

    Backtracking needs element removal after recursion [OK]
Hint: Always remove last element after recursive call [OK]
Common Mistakes:
  • Not removing last element after recursion
  • Wrong base case check
  • Loop starting index error
5. You want to generate all unique combinations from array [1, 2, 3] that sum to 4. Which of the following modifications ensures no duplicate combinations appear when numbers can be reused multiple times?
hard
A. Sort the array and skip duplicates by checking if current element equals previous
B. In recursive calls, pass i as start index to allow reuse and avoid duplicates
C. In recursive calls, always pass 0 as start index to restart from beginning
D. Use a global visited array to mark elements used

Solution

  1. Step 1: Understand reuse and duplicates in combinations

    Allowing reuse means next recursion starts from current index i, not 0, to avoid duplicate sets in different orders.
  2. Step 2: Identify correct start index usage

    Passing i as start index allows reuse and prevents duplicates by not revisiting earlier elements.
  3. Final Answer:

    In recursive calls, pass i as start index to allow reuse and avoid duplicates -> Option B
  4. Quick Check:

    Start index = i to reuse and avoid duplicates [OK]
Hint: Pass current index as start to reuse elements [OK]
Common Mistakes:
  • Restarting from 0 causing duplicates
  • Using visited array unnecessarily
  • Not sorting or skipping duplicates properly
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard