给定数字x,请打印所有可能的非递增序列,其总和等于x。
例子:
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
强烈建议您最小化浏览器,然后自己尝试。
这个想法是使用一个递归函数,一个数组arr []来一个接一个地存储所有序列,以及一个索引变量curr_idx来将当前的下一个索引存储在arr []中。下面是算法。
1)如果当前总和等于x,则打印当前序列。
2)将所有可能的数字从1到x-curr_sum放置在数组中的curr_idx上。此处curr_sum是arr []中当前元素的总和。放置数字后,再次输入curr_sum + number和curr_idx + 1。
下面是上述步骤的实现。
C++
// C++ program to generate all non-increasing
// sequences of sum equals to x
#include
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 pevious 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 on 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 pevious 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 pevious 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 pevious 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
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 pevious 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
输出:
1 1 1 1 1
2 1 1 1
2 2 1
3 1 1
3 2
4 1
5