Print all non-increasing sequences of sum equal to a given number x
Given a number x, print all possible non-increasing sequences with sum equals to x.
Examples:
Input: x = 3
Output: 1 1 1
2 1
3
Input: x = 4
Output: 1 1 1 1
2 1 1
2 2
3 1
4
We strongly recommend you to minimize your browser and try this yourself first.
The idea is to use a recursive function, an array arr[] to store all sequences one by one and an index variable curr_idx to store current next index in arr[]. Below is algorithm.
1) If current sum is equal to x, then print current sequence.
2) Place all possible numbers from 1 to x-curr_sum numbers at curr_idx in array. Here curr_sum is sum of current elements in arr[]. After placing a number, recur for curr_sum + number and curr_idx+1.
Below is the implementation of above steps.
C++
#include<bits/stdc++.h>
using namespace std;
void printArr( int arr[], int n)
{
for ( int i = 0; i < n; i++)
cout << arr[i] << " " ;
cout << endl;
}
void generateUtil( int x, int arr[], int curr_sum,
int curr_idx)
{
if (curr_sum == x)
{
printArr(arr, curr_idx);
return ;
}
int num = 1;
while (num <= x - curr_sum &&
(curr_idx == 0 ||
num <= arr[curr_idx - 1]))
{
arr[curr_idx] = num;
generateUtil(x, arr, curr_sum + num,
curr_idx + 1);
num++;
}
}
void generate( int x)
{
int arr[x];
generateUtil(x, arr, 0, 0);
}
int main()
{
int x = 5;
generate(x);
return 0;
}
|
Java
class GFG {
static void printArr( int arr[], int n)
{
for ( int i = 0 ; i < n; i++)
System.out.printf( "%d " , arr[i]);
System.out.println( "" );
}
static void generateUtil( int x, int arr[],
int curr_sum, int curr_idx)
{
if (curr_sum == x)
{
printArr(arr, curr_idx);
return ;
}
int num = 1 ;
while (num <= x - curr_sum &&
(curr_idx == 0 ||
num <= arr[curr_idx - 1 ]))
{
arr[curr_idx] = num;
generateUtil(x, arr, curr_sum+num,
curr_idx + 1 );
num++;
}
}
static void generate( int x)
{
int arr[] = new int [x];
generateUtil(x, arr, 0 , 0 );
}
public static void main(String[] args)
{
int x = 5 ;
generate(x);
}
}
|
Python3
def printArr(arr, n):
for i in range ( 0 , n):
print (arr[i], end = " " )
print ("")
def generateUtil(x, arr, curr_sum,
curr_idx):
if (curr_sum = = x):
printArr(arr, curr_idx)
return
num = 1
while (num < = x - curr_sum and
(curr_idx = = 0 or
num < = arr[curr_idx - 1 ])):
arr[curr_idx] = num
generateUtil(x, arr,
curr_sum + num, curr_idx + 1 )
num + = 1
def generate(x):
arr = [ 0 ] * x
generateUtil(x, arr, 0 , 0 )
x = 5
generate(x)
|
C#
using System;
class GFG {
static void printArr( int []arr, int n)
{
for ( int i = 0; i < n; i++)
Console.Write( arr[i]);
Console.WriteLine();
}
static void generateUtil( int x, int []arr,
int curr_sum, int curr_idx)
{
if (curr_sum == x)
{
printArr(arr, curr_idx);
return ;
}
int num = 1;
while (num <= x - curr_sum &&
(curr_idx == 0 ||
num <= arr[curr_idx - 1]))
{
arr[curr_idx] = num;
generateUtil(x, arr, curr_sum+num,
curr_idx + 1);
num++;
}
}
static void generate( int x)
{
int []arr = new int [x];
generateUtil(x, arr, 0, 0);
}
public static void Main()
{
int x = 5;
generate(x);
}
}
|
PHP
<?php
function printArr( $arr , $n )
{
for ( $i = 0; $i < $n ; $i ++)
echo $arr [ $i ] , " " ;
echo " \n" ;
}
function generateUtil( $x , $arr , $curr_sum ,
$curr_idx )
{
if ( $curr_sum == $x )
{
printArr( $arr , $curr_idx );
return ;
}
$num = 1;
while ( $num <= $x - $curr_sum and
( $curr_idx == 0 or $num <=
$arr [ $curr_idx - 1]))
{
$arr [ $curr_idx ] = $num ;
generateUtil( $x , $arr , $curr_sum +
$num , $curr_idx + 1);
$num ++;
}
}
function generate( $x )
{
$arr = array ();
generateUtil( $x , $arr , 0, 0);
}
$x = 5;
generate( $x );
?>
|
Javascript
<script>
function printArr(arr, n)
{
for (let i = 0; i < n; i++)
document.write(arr[i] + " " );
document.write( "</br>" );
}
function generateUtil(x, arr, curr_sum, curr_idx)
{
if (curr_sum == x)
{
printArr(arr, curr_idx);
return ;
}
let num = 1;
while (num <= x - curr_sum &&
(curr_idx == 0 ||
num <= arr[curr_idx - 1]))
{
arr[curr_idx] = num;
generateUtil(x, arr, curr_sum + num,
curr_idx + 1);
num++;
}
}
function generate(x)
{
let arr = new Array(x);
generateUtil(x, arr, 0, 0);
}
let x = 5;
generate(x);
</script>
|
Output:
1 1 1 1 1
2 1 1 1
2 2 1
3 1 1
3 2
4 1
5
Last Updated :
10 Feb, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...