A number can always be represented as a sum of squares of other numbers. Note that 1 is a square, and we can always break a number as (1*1 + 1*1 + 1*1 + …). Given a number N, the task is to represent N as the sum of minimum square numbers.
Examples:
Input : 10
Output : 1 + 9
These are all possible ways
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1 + 1 + 4
1 + 1 + 4 + 4
1 + 9
Choose one with minimum numbersInput : 25
Output : 25
Prerequisites: Minimum number of squares whose sum equals to given number N
Approach: This is a typical application of dynamic programming. When we start from N = 6, we can reach 2 by subtracting the square of one i.e. one, 4 times, and by subtracting the square of two i.e. four, 1 time. So the subproblem for 2 is called twice.
Since the same subproblems are called again, this problem has the Overlapping Subproblems property. So-min square sum problem has both properties (see this and this) of a dynamic programming problem. Like other typical Dynamic Programming(DP) problems, recomputation of the same subproblems can be avoided by constructing a temporary array table[][] in a bottom-up manner.
Below is the implementation of the above approach:
C++
// C++ program to represent N as the // sum of minimum square numbers. #include <bits/stdc++.h> using namespace std; // Function for finding // minimum square numbers vector< int > minSqrNum( int n) { // A[i] of array arr store // minimum count of // square number to get i int arr[n + 1], k; // sqrNum[i] store last // square number to get i int sqrNum[n + 1]; vector< int > v; // Initialize arr[0] = 0; sqrNum[0] = 0; // Find minimum count of // square number for // all value 1 to n for ( int i = 1; i <= n; i++) { // In worst case it will // be arr[i-1]+1 we use all // combination of a[i-1] and add 1 arr[i] = arr[i - 1] + 1; sqrNum[i] = 1; k = 1; // Check for all square // number less or equal to i while (k * k <= i) { // if it gives less // count then update it if (arr[i] > arr[i - k * k] + 1) { arr[i] = arr[i - k * k] + 1; sqrNum[i] = k * k; } k++; } } // Vector v stores optimum // square number whose sum give N while (n > 0) { v.push_back(sqrNum[n]); n -= sqrNum[n]; } return v; } // Driver code int main() { int n = 10; vector< int > v; // Calling function v = minSqrNum(n); // Printing vector for ( auto i = v.begin(); i != v.end(); i++) { cout << *i; if (i + 1 != v.end()) cout << " + " ; } return 0; } |
Java
// Java program to represent // N as the sum of minimum // square numbers. import java.util.*; class GFG{ // Function for finding // minimum square numbers static Vector<Integer> minSqrNum( int n) { // A[i] of array arr store // minimum count of // square number to get i int []arr = new int [n + 1 ]; int k = 0 ; // sqrNum[i] store last // square number to get i int []sqrNum = new int [n + 1 ]; Vector<Integer> v = new Vector<>(); // Initialize arr[ 0 ] = 0 ; sqrNum[ 0 ] = 0 ; // Find minimum count of // square number for // all value 1 to n for ( int i = 1 ; i <= n; i++) { // In worst case it will // be arr[i-1]+1 we use all // combination of a[i-1] and add 1 arr[i] = arr[i - 1 ] + 1 ; sqrNum[i] = 1 ; k = 1 ; // Check for all square // number less or equal to i while (k * k <= i) { // if it gives less // count then update it if (arr[i] > arr[i - k * k] + 1 ) { arr[i] = arr[i - k * k] + 1 ; sqrNum[i] = k * k; } k++; } } // Vector v stores optimum // square number whose sum give N while (n > 0 ) { v.add(sqrNum[n]); n -= sqrNum[n]; } return v; } // Driver code public static void main(String[] args) { int n = 10 ; Vector<Integer> v; // Calling function v = minSqrNum(n); // Printing vector for ( int i = 0 ; i <v.size(); i++) { System.out.print(v.elementAt(i)); if (i+ 1 != v.size()) System.out.print( " + " ); } } } // This code is contributed by gauravrajput1 |
Python3
# Python3 program to represent N as the # sum of minimum square numbers. # Function for finding # minimum square numbers def minSqrNum(n): # arr[i] of array arr store # minimum count of # square number to get i arr = [ 0 ] * (n + 1 ) # sqrNum[i] store last # square number to get i sqrNum = [ 0 ] * (n + 1 ) v = [] # Find minimum count of # square number for # all value 1 to n for i in range (n + 1 ): # In worst case it will # be arr[i-1]+1 we use all # combination of a[i-1] and add 1 arr[i] = arr[i - 1 ] + 1 sqrNum[i] = 1 k = 1 ; # Check for all square # number less or equal to i while (k * k < = i): # If it gives less # count then update it if (arr[i] > arr[i - k * k] + 1 ): arr[i] = arr[i - k * k] + 1 sqrNum[i] = k * k k + = 1 # v stores optimum # square number whose sum give N while (n > 0 ): v.append(sqrNum[n]) n - = sqrNum[n]; return v # Driver code n = 10 # Calling function v = minSqrNum(n) # Printing vector for i in range ( len (v)): print (v[i], end = "") if (i < len (v) - 1 ): print ( " + " , end = "") # This article is contributed by Apurvaraj |
C#
// C# program to represent // N as the sum of minimum // square numbers. using System; using System.Collections.Generic; class GFG{ // Function for finding // minimum square numbers static List< int > minSqrNum( int n) { // A[i] of array arr store // minimum count of // square number to get i int []arr = new int [n + 1]; int k = 0; // sqrNum[i] store last // square number to get i int []sqrNum = new int [n + 1]; List< int > v = new List< int >(); // Initialize arr[0] = 0; sqrNum[0] = 0; // Find minimum count of // square number for // all value 1 to n for ( int i = 1; i <= n; i++) { // In worst case it will // be arr[i-1]+1 we use all // combination of a[i-1] and add 1 arr[i] = arr[i - 1] + 1; sqrNum[i] = 1; k = 1; // Check for all square // number less or equal to i while (k * k <= i) { // if it gives less // count then update it if (arr[i] > arr[i - k * k] + 1) { arr[i] = arr[i - k * k] + 1; sqrNum[i] = k * k; } k++; } } // List v stores optimum // square number whose sum give N while (n > 0) { v.Add(sqrNum[n]); n -= sqrNum[n]; } return v; } // Driver code public static void Main(String[] args) { int n = 10; List< int > v; // Calling function v = minSqrNum(n); // Printing vector for ( int i = 0; i <v.Count; i++) { Console.Write(v[i]); if (i+1 != v.Count) Console.Write( " + " ); } } } // This code is contributed by gauravrajput1 |
Javascript
<script> // Javascript program to represent N as the // sum of minimum square numbers. // Function for finding // minimum square numbers function minSqrNum(n) { // A[i] of array arr store // minimum count of // square number to get i var arr = Array(n+1), k; // sqrNum[i] store last // square number to get i var sqrNum = Array(n+1); var v = []; // Initialize arr[0] = 0; sqrNum[0] = 0; // Find minimum count of // square number for // all value 1 to n for ( var i = 1; i <= n; i++) { // In worst case it will // be arr[i-1]+1 we use all // combination of a[i-1] and add 1 arr[i] = arr[i - 1] + 1; sqrNum[i] = 1; k = 1; // Check for all square // number less or equal to i while (k * k <= i) { // if it gives less // count then update it if (arr[i] > arr[i - k * k] + 1) { arr[i] = arr[i - k * k] + 1; sqrNum[i] = k * k; } k++; } } // Vector v stores optimum // square number whose sum give N while (n > 0) { v.push(sqrNum[n]); n -= sqrNum[n]; } return v; } // Driver code var n = 10; var v = []; // Calling function v = minSqrNum(n); // Printing vector for ( var i = 0; i<v.length; i++) { document.write(v[i]); if (i + 1 != v.length) document.write( " + " ); } </script> |
1 + 9
Time Complexity: O(n3/2)
Auxiliary Space: O(n)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!