Minimize steps to reach K from 0 by adding 1 or doubling at each step

Given a positive integer **K**, the task is to find the minimum number of operations of the following two types, required to change 0 to K:

- Add one to the operand
- Multiply the operand by 2.

**Examples:**

Input:K = 1

Output:1

Explanation:

Step 1: 0 + 1 = 1 = K

Input:K = 4

Output:3

Explanation:

Step 1: 0 + 1 = 1,

Step 2: 1 * 2 = 2,

Step 3: 2 * 2 = 4 = K

**Approach:**

- If
**K**is an odd number, the last step must be adding 1 to it. - If
**K**is an even number, the last step is to multiply by 2 to minimise the number of steps. - Create a dp[] table that stores in every
**dp[i]**, the minimum steps required to reach**i**.

Below is the implementation of the above approach:

## C++

`// C++ program to implement the above approach ` `#include <bits/stdc++.h> ` `using` `namespace` `std; ` ` ` `// Function to find minimum operations ` `int` `minOperation(` `int` `k) ` `{ ` ` ` `// vector dp is initialised ` ` ` `// to store the steps ` ` ` `vector<` `int` `> dp(k + 1, 0); ` ` ` ` ` `for` `(` `int` `i = 1; i <= k; i++) { ` ` ` ` ` `dp[i] = dp[i - 1] + 1; ` ` ` ` ` `// For all even numbers ` ` ` `if` `(i % 2 == 0) { ` ` ` `dp[i] ` ` ` `= min(dp[i], ` ` ` `dp[i / 2] + 1); ` ` ` `} ` ` ` `} ` ` ` `return` `dp[k]; ` `} ` ` ` `// Driver Code ` `int` `main() ` `{ ` ` ` `int` `K = 12; ` ` ` `cout << minOperation(k); ` `} ` |

*chevron_right*

*filter_none*

## Java

`// Java program to implement the above approach ` `class` `GFG{ ` ` ` `// Function to find minimum operations ` `static` `int` `minOperation(` `int` `k) ` `{ ` ` ` ` ` `// dp is initialised ` ` ` `// to store the steps ` ` ` `int` `dp[] = ` `new` `int` `[k + ` `1` `]; ` ` ` ` ` `for` `(` `int` `i = ` `1` `; i <= k; i++) ` ` ` `{ ` ` ` `dp[i] = dp[i - ` `1` `] + ` `1` `; ` ` ` ` ` `// For all even numbers ` ` ` `if` `(i % ` `2` `== ` `0` `) ` ` ` `{ ` ` ` `dp[i] = Math.min(dp[i], dp[i / ` `2` `] + ` `1` `); ` ` ` `} ` ` ` `} ` ` ` `return` `dp[k]; ` `} ` ` ` `// Driver Code ` `public` `static` `void` `main (String []args) ` `{ ` ` ` `int` `K = ` `12` `; ` ` ` `System.out.print( minOperation(K)); ` `} ` `} ` ` ` `// This code is contributed by chitranayal ` |

*chevron_right*

*filter_none*

## Python3

`# Python3 program to implement the above approach ` ` ` `# Function to find minimum operations ` `def` `minOperation(k): ` ` ` ` ` `# dp is initialised ` ` ` `# to store the steps ` ` ` `dp ` `=` `[` `0` `] ` `*` `(k ` `+` `1` `) ` ` ` ` ` `for` `i ` `in` `range` `(` `1` `, k ` `+` `1` `): ` ` ` `dp[i] ` `=` `dp[i ` `-` `1` `] ` `+` `1` ` ` ` ` `# For all even numbers ` ` ` `if` `(i ` `%` `2` `=` `=` `0` `): ` ` ` `dp[i]` `=` `min` `(dp[i], dp[i ` `/` `/` `2` `] ` `+` `1` `) ` ` ` ` ` `return` `dp[k] ` ` ` `# Driver Code ` `if` `__name__ ` `=` `=` `'__main__'` `: ` ` ` ` ` `k ` `=` `12` ` ` ` ` `print` `(minOperation(k)) ` ` ` `# This code is contributed by mohit kumar 29 ` |

*chevron_right*

*filter_none*

## C#

`// C# program to implement the above approach ` `using` `System; ` `class` `GFG{ ` ` ` `// Function to find minimum operations ` `static` `int` `minOperation(` `int` `k) ` `{ ` ` ` ` ` `// dp is initialised ` ` ` `// to store the steps ` ` ` `int` `[]dp = ` `new` `int` `[k + 1]; ` ` ` ` ` `for` `(` `int` `i = 1; i <= k; i++) ` ` ` `{ ` ` ` `dp[i] = dp[i - 1] + 1; ` ` ` ` ` `// For all even numbers ` ` ` `if` `(i % 2 == 0) ` ` ` `{ ` ` ` `dp[i] = Math.Min(dp[i], dp[i / 2] + 1); ` ` ` `} ` ` ` `} ` ` ` `return` `dp[k]; ` `} ` ` ` `// Driver Code ` `public` `static` `void` `Main() ` `{ ` ` ` `int` `K = 12; ` ` ` `Console.Write(minOperation(K)); ` `} ` `} ` ` ` `// This code is contributed by Nidhi_Biet ` |

*chevron_right*

*filter_none*

**Output:**

5

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready.