Number of ways to calculate a target number using only array elements

11 Aug, 2021
Given an integer array, find number of ways to calculate a target number using only array elements and addition or subtraction operator.
Example: 
Input: arr[] = {-3, 1, 3, 5}, k = 6
Output: 4
Explanation - 
- (-3) + (3)
+ (1) + (5)
+ (-3) + (1) + (3) + (5)
- (-3) + (1) - (3) + (5)

Input: arr[] = {2, 3, -4, 4}, k = 5
Output: 6
Explanation - 
+ (2) + (3)
+ (2) + (3) + (4) + (-4)
+ (2) + (3) - (4) - (-4)
- (3) + (4) - (-4)
- (2) + (3) + (4)
- (2) + (3) - (-4)
The problem is similar to 0-1 Knapsack Problem where for every item, we either pick the complete item, or don’t pick it at all (0-1 property). The idea remains the same here i.e. we either include the current digit or ignore it. If we include the current digit, we subtract or add it from remaining target and recurse for remaining digits with new target. If target reaches 0, we increment the count. If we have processed all elements of the array and target is not reached, count remains unchanged.
Below is recursive implementation of above idea.  
C++
Java
Python3
C#
Javascript
// C++ program to find the number of ways to calculate// a target number using only array elements and// addition or subtraction operator.#include <iostream>#include <vector>using namespace std; // Function to find the number of ways to calculate// a target number using only array elements and// addition or subtraction operator.int findTotalWays(vector<int> arr, int i, int k){     // If target is reached, return 1    if (k == 0 && i == arr.size())        return 1;     // If all elements are processed and    // target is not reached, return 0    if (i >= arr.size())        return 0;     // Return total count of three cases    // 1. Don't consider current element    // 2. Consider current element and subtract it from target    // 3. Consider current element and add it to target    return findTotalWays(arr, i + 1, k)           + findTotalWays(arr, i + 1, k - arr[i])           + findTotalWays(arr, i + 1, k + arr[i]);} // Driver Programint main(){    vector<int> arr = { -3, 1, 3, 5, 7 };     // target number    int k = 6;     cout << findTotalWays(arr, 0, k) << endl;     return 0;}
// Java program to find the number// of ways to calculate a target// number using only array elements and// addition or subtraction operator.import java.util.*; class GFG {     // Function to find the number of ways to calculate    // a target number using only array elements and    // addition or subtraction operator.    static int findTotalWays(Vector<Integer> arr, int i, int k)    {         // If target is reached, return 1        if (k == 0 && i == arr.size()) {            return 1;        }         // If all elements are processed and        // target is not reached, return 0        if (i >= arr.size()) {            return 0;        }         // Return total count of three cases        // 1. Don't consider current element        // 2. Consider current element and subtract it from target        // 3. Consider current element and add it to target        return findTotalWays(arr, i + 1, k)            + findTotalWays(arr, i + 1, k - arr.get(i))            + findTotalWays(arr, i + 1, k + arr.get(i));    }     // Driver code    public static void main(String[] args)    {        int[] arr = { -3, 1, 3, 5 };        Vector<Integer> v = new Vector<Integer>();        for (int a : arr) {            v.add(a);        }         // target number        int k = 6;         System.out.println(findTotalWays(v, 0, k));    }} // This code contributed by Rajput-Ji
# Python 3 program to find the number of# ways to calculate a target number using# only array elements and addition or# subtraction operator. # Function to find the number of ways to# calculate a target number using only# array elements and addition or# subtraction operator.def findTotalWays(arr, i, k):     # If target is reached, return 1    if (k == 0 and i == len(arr)):        return 1        # If all elements are processed and    # target is not reached, return 0    if (i >= len(arr)):        return 0     # Return total count of three cases    # 1. Don't consider current element    # 2. Consider current element and    # subtract it from target    # 3. Consider current element and    # add it to target    return (findTotalWays(arr, i + 1, k) +            findTotalWays(arr, i + 1, k - arr[i]) +            findTotalWays(arr, i + 1, k + arr[i])) # Driver Codeif __name__ == '__main__':    arr = [-3, 1, 3, 5, 7]     # target number    k = 6     print(findTotalWays(arr, 0, k))     # This code is contributed by# Surendra_Gangwar
// C# program to find the number// of ways to calculate a target// number using only array elements and// addition or subtraction operator.using System;using System.Collections.Generic; class GFG {     // Function to find the number of ways to calculate    // a target number using only array elements and    // addition or subtraction operator.    static int findTotalWays(List<int> arr, int i, int k)    {        // If target is reached, return 1        if (k == 0 && i ==  arr.Count) {            return 1;        }         // If all elements are processed and        // target is not reached, return 0        if (i >= arr.Count) {            return 0;        }         // Return total count of three cases        // 1. Don't consider current element        // 2. Consider current element and subtract it from target        // 3. Consider current element and add it to target        return findTotalWays(arr, i + 1, k)            + findTotalWays(arr, i + 1, k - arr[i])            + findTotalWays(arr, i + 1, k + arr[i]);    }     // Driver code    public static void Main(String[] args)    {        int[] arr = { -3, 1, 3, 5, 7 };        List<int> v = new List<int>();        foreach(int a in arr)        {            v.Add(a);        }         // target number        int k = 6;         Console.WriteLine(findTotalWays(v, 0, k));    }} // This code has been contributed by 29AjayKumar
<script> // Javascript program to find the number// of ways to calculate a target// number using only array elements and// addition or subtraction operator. // Function to find the number of ways to// calculate a target number using only// array elements and addition or// subtraction operator.function findTotalWays(arr, i, k){         // If target is reached, return 1    if (k == 0 && i == arr.length)    {        return 1;    }     // If all elements are processed and    // target is not reached, return 0    if (i >= arr.length)    {        return 0;    }     // Return total count of three cases    // 1. Don't consider current element    // 2. Consider current element and    //    subtract it from target    // 3. Consider current element and    //    add it to target    return findTotalWays(arr, i + 1, k) +           findTotalWays(arr, i + 1, k - arr[i]) +           findTotalWays(arr, i + 1, k + arr[i]);} // Driver codelet arr = [ -3, 1, 3, 5 ,7 ];let k = 6; document.write(findTotalWays(arr, 0, k)); // This code is contributed by rag2127 </script>
Output : 
10
Time Complexity: O(3^n)Auxiliary Space: O(n) 
This article is contributed by Aditya Goel. If you like GeeksforGeeks and would like to contribute, you can also write an article and mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above 
SURENDRA_GANGWAR
Rajput-Ji
29AjayKumar
ShivendraPorwal
rag2127
pankajsharmagfg
knapsack
Algorithms
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
DSA Sheet by Love Babbar
SDE SHEET - A Complete Guide for SDE Preparation
What is Hashing | A Complete Tutorial
Find if there is a path between two vertices in an undirected graph
CPU Scheduling in Operating Systems
Understanding Time Complexity with Simple Examples
A* Search Algorithm
What is Algorithm | Introduction to Algorithms
Recursive Practice Problems with Solutions
Analysis of Algorithms | Set 2 (Worst, Average and Best Cases)