Minimum number of squares whose sum equals to given number N | set 2
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 numbers
Input : 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++
#include <bits/stdc++.h>
using namespace std;
vector< int > minSqrNum( int n)
{
int arr[n + 1], k;
int sqrNum[n + 1];
vector< int > v;
arr[0] = 0;
sqrNum[0] = 0;
for ( int i = 1; i <= n; i++)
{
arr[i] = arr[i - 1] + 1;
sqrNum[i] = 1;
k = 1;
while (k * k <= i)
{
if (arr[i] > arr[i - k * k] + 1)
{
arr[i] = arr[i - k * k] + 1;
sqrNum[i] = k * k;
}
k++;
}
}
while (n > 0)
{
v.push_back(sqrNum[n]);
n -= sqrNum[n];
}
return v;
}
int main()
{
int n = 10;
vector< int > v;
v = minSqrNum(n);
for ( auto i = v.begin();
i != v.end(); i++)
{
cout << *i;
if (i + 1 != v.end())
cout << " + " ;
}
return 0;
}
|
Java
import java.util.*;
class GFG{
static Vector<Integer> minSqrNum( int n)
{
int []arr = new int [n + 1 ];
int k = 0 ;
int []sqrNum = new int [n + 1 ];
Vector<Integer> v = new Vector<>();
arr[ 0 ] = 0 ;
sqrNum[ 0 ] = 0 ;
for ( int i = 1 ; i <= n; i++)
{
arr[i] = arr[i - 1 ] + 1 ;
sqrNum[i] = 1 ;
k = 1 ;
while (k * k <= i)
{
if (arr[i] > arr[i - k * k] + 1 )
{
arr[i] = arr[i - k * k] + 1 ;
sqrNum[i] = k * k;
}
k++;
}
}
while (n > 0 )
{
v.add(sqrNum[n]);
n -= sqrNum[n];
}
return v;
}
public static void main(String[] args)
{
int n = 10 ;
Vector<Integer> v;
v = minSqrNum(n);
for ( int i = 0 ; i <v.size(); i++)
{
System.out.print(v.elementAt(i));
if (i+ 1 != v.size())
System.out.print( " + " );
}
}
}
|
Python3
def minSqrNum(n):
arr = [ 0 ] * (n + 1 )
sqrNum = [ 0 ] * (n + 1 )
v = []
for i in range (n + 1 ):
arr[i] = arr[i - 1 ] + 1
sqrNum[i] = 1
k = 1 ;
while (k * k < = i):
if (arr[i] > arr[i - k * k] + 1 ):
arr[i] = arr[i - k * k] + 1
sqrNum[i] = k * k
k + = 1
while (n > 0 ):
v.append(sqrNum[n])
n - = sqrNum[n];
return v
n = 10
v = minSqrNum(n)
for i in range ( len (v)):
print (v[i], end = "")
if (i < len (v) - 1 ):
print ( " + " , end = "")
|
C#
using System;
using System.Collections.Generic;
class GFG{
static List< int > minSqrNum( int n)
{
int []arr = new int [n + 1];
int k = 0;
int []sqrNum = new int [n + 1];
List< int > v = new List< int >();
arr[0] = 0;
sqrNum[0] = 0;
for ( int i = 1; i <= n; i++)
{
arr[i] = arr[i - 1] + 1;
sqrNum[i] = 1;
k = 1;
while (k * k <= i)
{
if (arr[i] > arr[i - k * k] + 1)
{
arr[i] = arr[i - k * k] + 1;
sqrNum[i] = k * k;
}
k++;
}
}
while (n > 0)
{
v.Add(sqrNum[n]);
n -= sqrNum[n];
}
return v;
}
public static void Main(String[] args)
{
int n = 10;
List< int > v;
v = minSqrNum(n);
for ( int i = 0; i <v.Count; i++)
{
Console.Write(v[i]);
if (i+1 != v.Count)
Console.Write( " + " );
}
}
}
|
Javascript
<script>
function minSqrNum(n)
{
var arr = Array(n+1), k;
var sqrNum = Array(n+1);
var v = [];
arr[0] = 0;
sqrNum[0] = 0;
for ( var i = 1; i <= n; i++)
{
arr[i] = arr[i - 1] + 1;
sqrNum[i] = 1;
k = 1;
while (k * k <= i)
{
if (arr[i] > arr[i - k * k] + 1)
{
arr[i] = arr[i - k * k] + 1;
sqrNum[i] = k * k;
}
k++;
}
}
while (n > 0)
{
v.push(sqrNum[n]);
n -= sqrNum[n];
}
return v;
}
var n = 10;
var v = [];
v = minSqrNum(n);
for ( var i = 0; i<v.length; i++)
{
document.write(v[i]);
if (i + 1 != v.length)
document.write( " + " );
}
</script>
|
Time Complexity: O(n3/2)
Auxiliary Space: O(n)
Last Updated :
05 Nov, 2021
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...