C# – SoftUni – Natural Order Sequences

Another SoftUni algorithm problem that I have considered interesting is presented here:


You are given an integer S. Generate all non-empty sequences of numbers in range [1…S], which have sum of elements ≤ S. Display the sequences in their natural order, e.g. {1} ≤ {1, 1} ≤ … ≤ {2} ≤ {2, 1} ≤ {2, 1, 1} ≤ {2, 2}.

Input

On the single input line you are given the number S.

Output

  • Print each sequence on separate line. The elements in a sequence must be separated by a single space.
  • The elements in the sequences are distinct and their order matters: the sequences {1, 2} and {2, 1} are different and should both be printed.
  • The sequences should be printed in their natural order (see the examples below).

Constraints

  • The number S is integer in the range [1 … 16].
  • Time limit: 100 ms. Allowed memory: 24 MB.

saving


What is the idea here? It is obvious, that it is some type of a recursion. If it was only with the 1, we may notice that they grow bigger and bigger. E.g., 1, 1 1, 1 1 1, etc. Thus, the loop is obvious and easy to implement. But we do not have only 1, we have other numbers as well. Thus, for 7 we should have “3 1 2 1” written somewhere. The question is where? 🙂 The answer is exactly below “3 1 2”

Long story short, try to debug the solution until you get it. Here comes the code:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class Sequences
{
    static StringBuilder stringBuilder = new StringBuilder();
    static void Main()
    {
        int readSum = int.Parse(Console.ReadLine());
        List<int> variations = new List<int>(new int[readSum]);
        GenerateSequence(0, 0, readSum, variations);
        Console.WriteLine(stringBuilder);
    }

    public static void GenerateSequence(int idx, int currSum, int readSum, List<int> variations)
    {

        if (currSum <= readSum && currSum!=0)
        {
            stringBuilder.AppendLine(string.Join(" ", variations.TakeWhile(x => x != 0)));
        }

        if (currSum >= readSum || idx >= variations.Count)
        {
            return;
        }

        for (int i = 1; i <= readSum; i++)
        {
            variations[idx] = i;
            GenerateSequence(idx + 1, currSum + i, readSum, variations);
        }
        variations[idx] = 0;
    }
}

Cheers! 🙂