Open In App

Print all non-increasing sequences of sum equal to a given number x

Improve
Improve
Like Article
Like
Save
Share
Report

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++




// C++ program to generate all non-increasing
// sequences of sum equals to x
#include<bits/stdc++.h>
using namespace std;
 
// Utility function to print array
// arr[0..n-1]
void printArr(int arr[], int n)
{
    for(int i = 0; i < n; i++)
      cout << arr[i] << " ";
    cout << endl;
}
 
// Recursive Function to generate all
// non-increasing sequences
// with sum x
// arr[]    --> Elements of current sequence
// curr_sum --> Current Sum
// curr_idx --> Current index in arr[]
void generateUtil(int x, int arr[], int curr_sum,
                                    int curr_idx)
{
     
   // If current sum is equal to x,
   // then we found a sequence
   if (curr_sum == x)
   {
      printArr(arr, curr_idx);
      return;
   }
 
   // Try placing all numbers from
   // 1 to x-curr_sum at current index
   int num = 1;
 
   // The placed number must also be
   // smaller than previously placed
   // numbers and it may be equal to
   // the previous stored value, i.e.,
   // arr[curr_idx-1] if there exists
   // a previous number
   while (num <= x - curr_sum &&
         (curr_idx == 0 ||
          num <= arr[curr_idx - 1]))
   {
        
       // Place number at curr_idx
       arr[curr_idx] = num;
 
       // Recur
       generateUtil(x, arr, curr_sum + num,
                            curr_idx + 1);
 
       // Try next number
       num++;
   }
}
 
// A wrapper over generateUtil()
void generate(int x)
{
     
    // Array to store sequences one by one
    int arr[x];
    generateUtil(x, arr, 0, 0);
}
 
// Driver code
int main()
{
    int x = 5;
    generate(x);
    return 0;
}


Java




// Java program to generate all non-increasing
// sequences of sum equals to x
class GFG {
     
    // Utility function to print array
    // arr[0..n-1]
    static void printArr(int arr[], int n)
    {
        for (int i = 0; i < n; i++)
            System.out.printf("%d ", arr[i]);
             
        System.out.println("");
    }
     
    // Recursive Function to generate all
    // non-increasing sequences with sum x
    // arr[] --> Elements of current sequence
    // curr_sum --> Current Sum
    // curr_idx --> Current index in arr[]
    static void generateUtil(int x, int arr[],
                     int curr_sum, int curr_idx)
    {
         
        // If current sum is equal to x, then
        // we found a sequence
        if (curr_sum == x)
        {
            printArr(arr, curr_idx);
            return;
        }
         
        // Try placing all numbers from 1 to
        // x-curr_sum at current index
        int num = 1;
         
        // The placed number must also be
           // smaller than previously placed
           // numbers and it may be equal to
           // the previous stored value, i.e.,
           // arr[curr_idx-1] if there exists
           // a previous number
        while (num <= x - curr_sum &&
                             (curr_idx == 0 ||
                     num <= arr[curr_idx - 1]))
        {
             
            // Place number at curr_idx
            arr[curr_idx] = num;
         
            // Recur
            generateUtil(x, arr, curr_sum+num,
                                     curr_idx + 1);
         
            // Try next number
            num++;
        }
    }
     
    // A wrapper over generateUtil()
    static void generate(int x)
    {
         
        // Array to store sequences on by one
        int arr[] = new int [x];
        generateUtil(x, arr, 0, 0);
    }
     
    // Driver program
    public static void main(String[] args)
    {
        int x = 5;
        generate(x);
    }
}
 
// This code is contributed by Smitha.


Python3




# Python3 program to generate all
# non-increasing sequences of sum
# equals to x
 
# Utility function to print array
# arr[0..n-1]
def printArr(arr, n):
 
    for i in range(0, n):
        print(arr[i], end = " ")
         
    print("")
 
 
# Recursive Function to generate
# all non-increasing sequences
# with sum x arr[] --> Elements
# of current sequence
# curr_sum --> Current Sum
# curr_idx --> Current index in
# arr[]
def generateUtil(x, arr, curr_sum,
                         curr_idx):
 
# If current sum is equal to x,
# then we found a sequence
    if (curr_sum == x):
 
        printArr(arr, curr_idx)
        return
 
 
    # Try placing all numbers from
    # 1 to x-curr_sum at current
    # index
    num = 1
     
    # The placed number must also be
    # smaller than previously placed
    # numbers and it may be equal to
    # the previous stored value, i.e.,
    # arr[curr_idx-1] if there exists
    # a previous number
    while (num <= x - curr_sum and
                (curr_idx == 0 or
           num <= arr[curr_idx - 1])):
 
        # Place number at curr_idx
        arr[curr_idx] = num
     
        # Recur
        generateUtil(x, arr,
            curr_sum + num, curr_idx + 1)
     
        # Try next number
        num += 1
 
 
 
# A wrapper over generateUtil()
def generate(x):
 
    # Array to store sequences
    # on by one
    arr = [0] * x
    generateUtil(x, arr, 0, 0)
 
 
# Driver program
x = 5
generate(x)
 
# This code is contributed
# by Smitha.


C#




// C# program to generate all non-increasing
// sequences of sum equals to x
using System;
 
class GFG {
      
    // Utility function to print array
    // arr[0..n-1]
    static void printArr(int []arr, int n)
    {
        for (int i = 0; i < n; i++)
            Console.Write( arr[i]);
              
        Console.WriteLine();
    }
      
    // Recursive Function to generate all
    // non-increasing sequences with sum x
    // arr[] --> Elements of current sequence
    // curr_sum --> Current Sum
    // curr_idx --> Current index in arr[]
    static void generateUtil(int x, int []arr,
                     int curr_sum, int curr_idx)
    {
          
        // If current sum is equal to x, then
        // we found a sequence
        if (curr_sum == x)
        {
            printArr(arr, curr_idx);
            return;
        }
          
        // Try placing all numbers from 1 to
        // x-curr_sum at current index
        int num = 1;
          
        // The placed number must also be
        // smaller than previously placed
           // numbers and it may be equal to
           // the previous stored value, i.e.,
           // arr[curr_idx-1] if there exists
           // a previous number
        while (num <= x - curr_sum &&
                             (curr_idx == 0 ||
                     num <= arr[curr_idx - 1]))
        {
              
            // Place number at curr_idx
            arr[curr_idx] = num;
          
            // Recur
            generateUtil(x, arr, curr_sum+num,
                                     curr_idx + 1);
          
            // Try next number
            num++;
        }
    }
      
    // A wrapper over generateUtil()
    static void generate(int x)
    {
          
        // Array to store sequences on by one
        int []arr = new int [x];
        generateUtil(x, arr, 0, 0);
    }
      
    // Driver program
    public static void Main()
    {
        int x = 5;
        generate(x);
    }
}
  
// This code is contributed by nitin mittal.


PHP




<?php
// PHP program to generate all
// non-increasing sequences
// of sum equals to x
 
// function to print array
// arr[0..n-1]
function printArr($arr, $n)
{
    for ($i = 0; $i < $n; $i++)
    echo $arr[$i] , " ";
    echo " \n";
}
 
// Recursive Function to generate
// all non-increasing sequences
// with sum x
// arr[] --> Elements of current sequence
// curr_sum --> Current Sum
// curr_idx --> Current index in arr[]
function generateUtil($x, $arr, $curr_sum,
                                $curr_idx)
{
     
    // If current sum is equal to x,
    // then we found a sequence
    if ($curr_sum == $x)
    {
        printArr($arr, $curr_idx);
        return;
    }
     
    // Try placing all numbers from
    // 1 to x-curr_sum at current index
    $num = 1;
     
    // The placed number must also be
    // smaller than previously placed
    // numbers and it may be equal to
    // the previous stored value, i.e.,
    // arr[curr_idx-1] if there exists
    // a previous number
    while ($num <= $x - $curr_sum and
          ($curr_idx == 0 or $num <=
                $arr[$curr_idx - 1]))
    
        // Place number at curr_idx
        $arr[$curr_idx] = $num;
     
        // Recur
        generateUtil($x, $arr, $curr_sum +
                     $num, $curr_idx + 1);
     
        // Try next number
        $num++;
    }
}
 
// A wrapper over generateUtil()
function generate($x)
{
    // Array to store
    // sequences on by one
    $arr = array();
    generateUtil($x, $arr, 0, 0);
}
 
    // Driver Code
    $x = 5;
    generate($x);
 
// This code is contributed by anuj_67.
?>


Javascript




<script>
 
// Javascript program to generate all
// non-increasing sequences of sum equals to x
 
// Utility function to print array
// arr[0..n-1]
function printArr(arr, n)
{
    for(let i = 0; i < n; i++)
        document.write(arr[i] + " ");
           
    document.write("</br>");
}
   
// Recursive Function to generate all
// non-increasing sequences with sum x
// arr[] --> Elements of current sequence
// curr_sum --> Current Sum
// curr_idx --> Current index in arr[]
function generateUtil(x, arr, curr_sum, curr_idx)
{
     
    // If current sum is equal to x, then
    // we found a sequence
    if (curr_sum == x)
    {
        printArr(arr, curr_idx);
        return;
    }
       
    // Try placing all numbers from 1 to
    // x-curr_sum at current index
    let num = 1;
       
    // The placed number must also be
    // smaller than previously placed
    // numbers and it may be equal to
    // the previous stored value, i.e.,
    // arr[curr_idx-1] if there exists
    // a previous number
    while (num <= x - curr_sum &&
          (curr_idx == 0 ||
          num <= arr[curr_idx - 1]))
    {
         
        // Place number at curr_idx
        arr[curr_idx] = num;
       
        // Recur
        generateUtil(x, arr, curr_sum + num,
                             curr_idx + 1);
       
        // Try next number
        num++;
    }
}
   
// A wrapper over generateUtil()
function generate(x)
{
     
    // Array to store sequences on by one
    let arr = new Array(x);
    generateUtil(x, arr, 0, 0);
}
 
// Driver code  
let x = 5;
 
generate(x);
   
// This code is contributed by divyeshrabadiya07    
 
</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
Previous
Next
Share your thoughts in the comments
Similar Reads