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

Last Updated : 15 Jun, 2022

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

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[0]);` `    ``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``[0]);` `    ``echo` `MinimumCost(``\$a``, ``\$n``, ``\$x``);`   `// This code is contributed by ajit.` `?>`

## Javascript

 ``

Output:

`120`

Time Complexity: O(N + log(x)), as we are using a loop to traverse N times and log(x) times as in every traversal we are right shifting x by 1 bit which will be equivalent to log(x).

Auxiliary Space: O(1), as we are not using any extra space.