# Minimum cost to form a number X by adding up powers of 2

Given an array arr[] of N integers and an integer X. Element arr[i] in array denotes the cost to use 2i. The task is to find the minimum cost to choose the numbers which add up to X.

Examples:

Input: arr[] = { 20, 50, 60, 90 }, X = 7
Output: 120
22 + 21 + 20 = 4 + 2 + 1 = 7 with cost = 60 + 50 + 20 = 130
But we can use 22 + 3 * 20 = 4 + 3 * 1 = 7 with cost = 60 + 3 * 20 = 120 which is minimum possible.

Input: arr[] = { 10, 5, 50 }, X = 4
Output: 10

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: The problem can be solved using basic Dynamic Programming. The fact that every number can be formed using powers of 2 has been used here. We can initially calculate the minimal cost required to form powers of 2 themselves. The recurrence will be as follows:

a[i] = min(a[i], 2 * a[i – 1])

Once the array is re-computed, we can simply keep adding the cost according to the set bits in the number X.

Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach ` `#include ` `using` `namespace` `std; ` ` `  `// Function to return the minimum cost ` `int` `MinimumCost(``int` `a[], ``int` `n, ``int` `x) ` `{ ` ` `  `    ``// Re-compute the array ` `    ``for` `(``int` `i = 1; i < n; i++) { ` `        ``a[i] = min(a[i], 2 * a[i - 1]); ` `    ``} ` ` `  `    ``int` `ind = 0; ` ` `  `    ``int` `sum = 0; ` ` `  `    ``// Add answers for set bits ` `    ``while` `(x) { ` ` `  `        ``// If bit is set ` `        ``if` `(x & 1) ` `            ``sum += a[ind]; ` ` `  `        ``// Increase the counter ` `        ``ind++; ` ` `  `        ``// Right shift the number ` `        ``x = x >> 1; ` `    ``} ` ` `  `    ``return` `sum; ` `} ` ` `  `// Driver code ` `int` `main() ` `{ ` `    ``int` `a[] = { 20, 50, 60, 90 }; ` `    ``int` `x = 7; ` `    ``int` `n = ``sizeof``(a) / ``sizeof``(a); ` `    ``cout << MinimumCost(a, n, x); ` ` `  `    ``return` `0; ` `} `

## Java

 `// Java implementation of the approach ` `import` `java.io.*; ` ` `  `class` `GFG  ` `{ ` `     `  `// Function to return the minimum cost ` `static` `int` `MinimumCost(``int` `a[], ``int` `n, ``int` `x) ` `{ ` ` `  `    ``// Re-compute the array ` `    ``for` `(``int` `i = ``1``; i < n; i++)  ` `    ``{ ` `        ``a[i] = Math.min(a[i], ``2` `* a[i - ``1``]); ` `    ``} ` ` `  `    ``int` `ind = ``0``; ` ` `  `    ``int` `sum = ``0``; ` ` `  `    ``// Add answers for set bits ` `    ``while` `(x > ``0``)  ` `    ``{ ` ` `  `        ``// If bit is set ` `        ``if` `(x != ``0` `) ` `            ``sum += a[ind]; ` ` `  `        ``// Increase the counter ` `        ``ind++; ` ` `  `        ``// Right shift the number ` `        ``x = x >> ``1``; ` `    ``} ` ` `  `    ``return` `sum; ` `} ` ` `  `// Driver code ` `public` `static` `void` `main (String[] args)  ` `{ ` ` `  `    ``int` `a[] = { ``20``, ``50``, ``60``, ``90` `}; ` `    ``int` `x = ``7``; ` `    ``int` `n =a.length; ` `    ``System.out.println (MinimumCost(a, n, x)); ` `} ` `} ` ` `  `// This Code is contributed by akt_mit  `

## Python3

 `# Python 3 implementation of the approach ` ` `  `# Function to return the minimum cost ` `def` `MinimumCost(a, n, x): ` `     `  `    ``# Re-compute the array ` `    ``for` `i ``in` `range``(``1``, n, ``1``): ` `        ``a[i] ``=` `min``(a[i], ``2` `*` `a[i ``-` `1``]) ` ` `  `    ``ind ``=` `0` ` `  `    ``sum` `=` `0` ` `  `    ``# Add answers for set bits ` `    ``while` `(x): ` `         `  `        ``# If bit is set ` `        ``if` `(x & ``1``): ` `            ``sum` `+``=` `a[ind] ` ` `  `        ``# Increase the counter ` `        ``ind ``+``=` `1` ` `  `        ``# Right shift the number ` `        ``x ``=` `x >> ``1` ` `  `    ``return` `sum` ` `  `# Driver code ` `if` `__name__ ``=``=` `'__main__'``: ` `    ``a ``=` `[``20``, ``50``, ``60``, ``90``] ` `    ``x ``=` `7` `    ``n ``=` `len``(a) ` `    ``print``(MinimumCost(a, n, x)) ` ` `  `# This code is contributed by ` `# Surendra_Gangwar `

## C#

 `// C# implementation of the approach ` `using` `System; ` ` `  `class` `GFG  ` `{ ` `     `  `// Function to return the minimum cost ` `public` `static` `int` `MinimumCost(``int` `[]a, ``int` `n, ``int` `x) ` `{ ` ` `  `    ``// Re-compute the array ` `    ``for` `(``int` `i = 1; i < n; i++)  ` `    ``{ ` `        ``a[i] = Math.Min(a[i], 2 * a[i - 1]); ` `    ``} ` ` `  `    ``int` `ind = 0; ` ` `  `    ``int` `sum = 0; ` ` `  `    ``// Add answers for set bits ` `    ``while` `(x > 0)  ` `    ``{ ` ` `  `        ``// If bit is set ` `        ``if` `(x != 0 ) ` `            ``sum += a[ind]; ` ` `  `        ``// Increase the counter ` `        ``ind++; ` ` `  `        ``// Right shift the number ` `        ``x = x >> 1; ` `    ``} ` ` `  `    ``return` `sum; ` `} ` ` `  `// Driver code ` `public` `static` `void` `Main ()  ` `{ ` ` `  `    ``int` `[]a = { 20, 50, 60, 90 }; ` `    ``int` `x = 7; ` `    ``int` `n =a.Length; ` `    ``Console.WriteLine(MinimumCost(a, n, x)); ` `} ` `} ` ` `  `// This Code is contributed by SoM15242 `

## PHP

 `> 1; ` `    ``} ` ` `  `    ``return` `\$sum``; ` `} ` ` `  `    ``// Driver code ` `    ``\$a` `= ``array``( 20, 50, 60, 90 ); ` `    ``\$x` `= 7; ` `    ``\$n` `= sizeof(``\$a``) / sizeof(``\$a``); ` `    ``echo` `MinimumCost(``\$a``, ``\$n``, ``\$x``); ` ` `  `// This code is contributed by ajit. ` `?> `

Output:

```120
```

My Personal Notes arrow_drop_up Striver(underscore)79 at Codechef and codeforces D

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.