:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:var(--color-danger-fg)}.markdown-body .anchor{float:left;margin-left:-20px;padding-right:4px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre,.markdown-body details{margin-top:0;margin-bottom:16px}.markdown-body hr{height:.25em;background-color:var(--color-border-default);border:0;margin:24px 0;padding:0}.markdown-body blockquote{color:var(--color-fg-muted);border-left:.25em solid var(--color-border-default);padding:0 1em}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{font-weight:var(--base-text-weight-semibold,600);margin-top:24px;margin-bottom:16px;line-height:1.25}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:var(--color-fg-default);vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 tt,.markdown-body h1 code,.markdown-body h2 tt,.markdown-body h2 code,.markdown-body h3 tt,.markdown-body h3 code,.markdown-body h4 tt,.markdown-body h4 code,.markdown-body h5 tt,.markdown-body h5 code,.markdown-body h6 tt,.markdown-body h6 code{font-size:inherit;padding:0 .2em}.markdown-body h1{border-bottom:1px solid var(--color-border-muted);padding-bottom:.3em;font-size:2em}.markdown-body h2{border-bottom:1px solid var(--color-border-muted);padding-bottom:.3em;font-size:1.5em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{color:var(--color-fg-muted);font-size:.85em}.markdown-body summary h1,.markdown-body summary h2,.markdown-body summary h3,.markdown-body summary h4,.markdown-body summary h5,.markdown-body summary h6{display:inline-block}.markdown-body summary h1 .anchor,.markdown-body summary h2 .anchor,.markdown-body summary h3 .anchor,.markdown-body summary h4 .anchor,.markdown-body summary h5 .anchor,.markdown-body summary h6 .anchor{margin-left:-40px}.markdown-body summary h1,.markdown-body summary h2{border-bottom:0;padding-bottom:0}.markdown-body ul,.markdown-body ol{padding-left:2em}.markdown-body ul.no-list,.markdown-body ol.no-list{padding:0;list-style-type:none}.markdown-body ol[type=a]{list-style-type:lower-alpha}.markdown-body ol[type=A]{list-style-type:upper-alpha}.markdown-body ol[type=i]{list-style-type:lower-roman}.markdown-body ol[type=I]{list-style-type:upper-roman}.markdown-body ol[type="1"]{list-style-type:decimal}.markdown-body div>ol:not([type]){list-style-type:decimal}.markdown-body ul ul,.markdown-body ul ol,.markdown-body ol ol,.markdown-body ol ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{font-size:1em;font-style:italic;font-weight:var(--base-text-weight-semibold,600);margin-top:16px;padding:0}.markdown-body dl dd{margin-bottom:16px;padding:0 16px}.markdown-body table{width:100%;width:-webkit-max-content;width:-webkit-max-content;width:max-content;max-width:100%;display:block;overflow:auto}.markdown-body table th{font-weight:var(--base-text-weight-semibold,600)}.markdown-body table th,.markdown-body table td{border:1px solid var(--color-border-default);padding:6px 13px}.markdown-body table td>:last-child{margin-bottom:0}.markdown-body table tr{background-color:var(--color-canvas-default);border-top:1px solid var(--color-border-muted)}.markdown-body table tr:nth-child(2n){background-color:var(--color-canvas-subtle)}.markdown-body table img{background-color:transparent}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:var(--color-canvas-default)}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{float:left;width:auto;border:1px solid var(--color-border-default);margin:13px 0 0;padding:7px;display:block;overflow:hidden}.markdown-body span.frame span img{float:left;display:block}.markdown-body span.frame span span{clear:both;color:var(--color-fg-default);padding:5px 0 0;display:block}.markdown-body span.align-center{clear:both;display:block;overflow:hidden}.markdown-body span.align-center>span{text-align:center;margin:13px auto 0;display:block;overflow:hidden}.markdown-body span.align-center span img{text-align:center;margin:0 auto}.markdown-body span.align-right{clear:both;display:block;overflow:hidden}.markdown-body span.align-right>span{text-align:right;margin:13px 0 0;display:block;overflow:hidden}.markdown-body span.align-right span img{text-align:right;margin:0}.markdown-body span.float-left{float:left;margin-right:13px;display:block;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{float:right;margin-left:13px;display:block;overflow:hidden}.markdown-body span.float-right>span{text-align:right;margin:13px auto 0;display:block;overflow:hidden}.markdown-body code,.markdown-body tt{white-space:break-spaces;background-color:var(--color-neutral-muted);border-radius:6px;margin:0;padding:.2em .4em;font-size:85%}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}.markdown-body samp{font-size:85%}.markdown-body pre{word-wrap:normal}.markdown-body pre code{font-size:100%}.markdown-body pre>code{word-break:normal;white-space:pre;background:0 0;border:0;margin:0;padding:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{word-break:normal;margin-bottom:0}.markdown-body .highlight pre,.markdown-body pre{background-color:var(--color-canvas-subtle);border-radius:6px;padding:16px;font-size:85%;line-height:1.45;overflow:auto}.markdown-body pre code,.markdown-body pre tt{max-width:auto;line-height:inherit;word-wrap:normal;background-color:transparent;border:0;margin:0;padding:0;display:inline;overflow:visible}.markdown-body .csv-data td,.markdown-body .csv-data th{text-align:left;white-space:nowrap;padding:5px;font-size:12px;line-height:1;overflow:hidden}.markdown-body .csv-data .blob-num{text-align:right;background:var(--color-canvas-default);border:0;padding:10px 8px 9px}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:var(--base-text-weight-semibold,600);background:var(--color-canvas-subtle);border-top:0}.markdown-body [data-footnote-ref]:before{content:"["}.markdown-body [data-footnote-ref]:after{content:"]"}.markdown-body .footnotes{color:var(--color-fg-muted);border-top:1px solid var(--color-border-default);font-size:12px}.markdown-body .footnotes ol{padding-left:16px}.markdown-body .footnotes ol ul{margin-top:16px;padding-left:16px;display:inline-block}.markdown-body .footnotes li{position:relative}.markdown-body .footnotes li:target:before{pointer-events:none;content:"";border:2px solid var(--color-accent-emphasis);border-radius:6px;position:absolute;top:-8px;bottom:-8px;left:-24px;right:-8px}.markdown-body .footnotes li:target{color:var(--color-fg-default)}.markdown-body .footnotes .data-footnote-backref g-emoji{font-family:monospace}.markdown-body{background-color:var(--color-canvas-default);color:var(--color-fg-default)}.markdown-body a{color:var(--color-accent-fg);text-decoration:none}.markdown-body a:hover{text-decoration:underline}.markdown-body img[align=center]{margin:0 auto}.markdown-body iframe{background-color:#fff;border:0;margin-bottom:16px}.markdown-body svg.octicon{fill:currentColor}.markdown-body .anchor>.octicon{display:inline}.markdown-body figcaption{text-align:center;padding-top:2px}.markdown-body .highlight .token.keyword,.gfm-highlight .token.keyword{color:var(--color-prettylights-syntax-keyword)}.markdown-body .highlight .token.tag .token.class-name,.markdown-body .highlight .token.tag .token.script .token.punctuation,.gfm-highlight .token.tag .token.class-name,.gfm-highlight .token.tag .token.script .token.punctuation{color:var(--color-prettylights-syntax-storage-modifier-import)}.markdown-body .highlight .token.operator,.markdown-body .highlight .token.number,.markdown-body .highlight .token.boolean,.markdown-body .highlight .token.tag .token.punctuation,.markdown-body .highlight .token.tag .token.script .token.script-punctuation,.markdown-body .highlight .token.tag .token.attr-name,.gfm-highlight .token.operator,.gfm-highlight .token.number,.gfm-highlight .token.boolean,.gfm-highlight .token.tag .token.punctuation,.gfm-highlight .token.tag .token.script .token.script-punctuation,.gfm-highlight .token.tag .token.attr-name{color:var(--color-prettylights-syntax-constant)}.markdown-body .highlight .token.function,.gfm-highlight .token.function{color:var(--color-prettylights-syntax-entity)}.markdown-body .highlight .token.string,.gfm-highlight .token.string{color:var(--color-prettylights-syntax-string)}.markdown-body .highlight .token.comment,.gfm-highlight .token.comment{color:var(--color-prettylights-syntax-comment)}.markdown-body .highlight .token.class-name,.gfm-highlight .token.class-name{color:var(--color-prettylights-syntax-variable)}.markdown-body .highlight .token.regex,.gfm-highlight .token.regex{color:var(--color-prettylights-syntax-string)}.markdown-body .highlight .token.regex .regex-delimiter,.gfm-highlight .token.regex .regex-delimiter{color:var(--color-prettylights-syntax-constant)}.markdown-body .highlight .token.tag .token.tag,.markdown-body .highlight .token.property,.gfm-highlight .token.tag .token.tag,.gfm-highlight .token.property{color:var(--color-prettylights-syntax-entity-tag)}.markdown-body .highlight .token.deleted,.gfm-highlight .token.deleted{color:var(--color-prettylights-syntax-markup-deleted-text);background-color:var(--color-prettylights-syntax-markup-deleted-bg)}.markdown-body .highlight .token.inserted,.gfm-highlight .token.inserted{color:var(--color-prettylights-syntax-markup-inserted-text);background-color:var(--color-prettylights-syntax-markup-inserted-bg)}

Find number of solutions of a linear equation of n variables (original) (raw)

Last Updated : 16 Dec, 2022

Given a linear equation of n variables, find number of non-negative integer solutions of it. For example, let the given equation be "x + 2y = 5", solutions of this equation are "x = 1, y = 2", "x = 5, y = 0" and "x = 3, y = 1". It may be assumed that all coefficients in given equation are positive integers.
Example :

Input: coeff[] = {1, 2}, rhs = 5 Output: 3 The equation "x + 2y = 5" has 3 solutions. (x=3,y=1), (x=1,y=2), (x=5,y=0)

Input: coeff[] = {2, 2, 3}, rhs = 4 Output: 3 The equation "2x + 2y + 3z = 4" has 3 solutions. (x=0,y=2,z=0), (x=2,y=0,z=0), (x=1,y=1,z=0)

We strongly recommend you to minimize your browser and try this yourself first.
We can solve this problem recursively. The idea is to subtract first coefficient from rhs and then recur for remaining value of rhs.

If rhs = 0 countSol(coeff, 0, rhs, n-1) = 1 Else countSol(coeff, 0, rhs, n-1) = ?countSol(coeff, i, rhs-coeff[i], m-1) where coeff[i]<=rhs and i varies from 0 to n-1

Below is recursive implementation of above solution.

C++ `

// A naive recursive C++ program to // find number of non-negative solutions // for a given linear equation #include<bits/stdc++.h> using namespace std;

// Recursive function that returns // count of solutions for given rhs // value and coefficients coeff[start..end] int countSol(int coeff[], int start, int end, int rhs) { // Base case if (rhs == 0) return 1;

// Initialize count
// of solutions
int result = 0; 

// One by subtract all smaller or 
// equal coefficients and recur
for (int i = start; i <= end; i++)
if (coeff[i] <= rhs)
    result += countSol(coeff, i, end,
                       rhs - coeff[i]);

return result;

}

// Driver Code int main() { int coeff[] = {2, 2, 5}; int rhs = 4; int n = sizeof(coeff) / sizeof(coeff[0]); cout << countSol(coeff, 0, n - 1, rhs); return 0; }

Java

// A naive recursive Java program // to find number of non-negative // solutions for a given linear equation import java.io.*;

class GFG {

// Recursive function that returns 
// count of solutions for given
// rhs value and coefficients coeff[start..end]
static int countSol(int coeff[], int start,
                    int end, int rhs)
{
    // Base case
    if (rhs == 0)
    return 1;

    // Initialize count of solutions 
    int result = 0; 

    // One by subtract all smaller or
    // equal coefficients and recur
    for (int i = start; i <= end; i++)
    if (coeff[i] <= rhs)
        result += countSol(coeff, i, end, 
                           rhs - coeff[i]);

    return result;
}

// Driver Code
public static void main (String[] args)
{
    int coeff[] = {2, 2, 5};
    int rhs = 4;
    int n = coeff.length;
    System.out.println (countSol(coeff, 0, 
                                 n - 1, rhs));
        
}

}

// This code is contributed by vt_m.

Python3

A naive recursive Python program

to find number of non-negative

solutions for a given linear equation

Recursive function that returns

count of solutions for given rhs

value and coefficients coeff[stat...end]

def countSol(coeff, start, end, rhs):

# Base case
if (rhs == 0):
    return 1

# Initialize count of solutions
result = 0 

# One by one subtract all smaller or 
# equal coefficients and recur
for i in range(start, end+1):
    if (coeff[i] <= rhs):
        result += countSol(coeff, i, end,
                           rhs - coeff[i])

return result

Driver Code

coeff = [2, 2, 5] rhs = 4 n = len(coeff) print(countSol(coeff, 0, n - 1, rhs))

This code is contributed

by Soumen Ghosh

C#

// A naive recursive C# program // to find number of non-negative // solutions for a given linear equation using System;

class GFG {

// Recursive function that 
// returns count of solutions 
// for given RHS value and 
// coefficients coeff[start..end]
static int countSol(int []coeff, int start,
                    int end, int rhs)
{
    // Base case
    if (rhs == 0)
    return 1;

    // Initialize count of solutions 
    int result = 0; 

    // One by subtract all smaller or
    // equal coefficients and recur
    for (int i = start; i <= end; i++)
    if (coeff[i] <= rhs)
        result += countSol(coeff, i, end,
                           rhs - coeff[i]);

    return result;
}

// Driver Code
public static void Main ()
{
    int []coeff = {2, 2, 5};
    int rhs = 4;
    int n = coeff.Length;
    Console.Write (countSol(coeff, 0, 
                            n - 1, rhs));
        
}

}

// This Code is contributed // by nitin mittal.

PHP

start,start, start,end, $rhs) { // Base case if ($rhs == 0) return 1; // Initialize count of solutions $result = 0; // One by subtract all smaller or // equal coefficients and recur for ($i = start;start; start;i <= end;end; end;i++) if ($coeff[$i] <= $rhs) result+=countSol(result += countSol(result+=countSol(coeff, i,i, i,end, rhs−rhs - rhscoeff[$i]); return $result; } // Driver Code $coeff = array (2, 2, 5); $rhs = 4; n=sizeof(n = sizeof(n=sizeof(coeff); echo countSol($coeff, 0, n−1,n - 1, n1,rhs); // This code is contributed by ajit ?>

JavaScript

`

Output :

3

Time Complexity: O(2^n)

Auxiliary Space: O(2^n) , because of recursive calls

The time complexity of above solution is exponential. We can solve this problem in Pseudo Polynomial Time (time complexity is dependent on numeric value of input) using Dynamic Programming. The idea is similar to Dynamic Programming solution Subset Sum problem. Below is Dynamic Programming based implementation.

C++ `

// A Dynamic programming based C++ // program to find number of non-negative // solutions for a given linear equation #include<bits/stdc++.h> using namespace std;

// Returns count of solutions for // given rhs and coefficients coeff[0..n-1] int countSol(int coeff[], int n, int rhs) { // Create and initialize a table // to store results of subproblems int dp[rhs + 1]; memset(dp, 0, sizeof(dp)); dp[0] = 1;

// Fill table in bottom up manner
for (int i = 0; i < n; i++)
for (int j = coeff[i]; j <= rhs; j++)
    dp[j] += dp[j - coeff[i]];

return dp[rhs];

}

// Driver Code int main() { int coeff[] = {2, 2, 5}; int rhs = 4; int n = sizeof(coeff) / sizeof(coeff[0]); cout << countSol(coeff, n, rhs); return 0; }

Java

// A Dynamic programming based Java program // to find number of non-negative solutions // for a given linear equation import java.util.Arrays;

class GFG { // Returns count of solutions for given // rhs and coefficients coeff[0..n-1] static int countSol(int coeff[], int n, int rhs) {

    // Create and initialize a table to 
    // store results of subproblems
    int dp[] = new int[rhs + 1];
    Arrays.fill(dp, 0);
    dp[0] = 1;

    // Fill table in bottom up manner
    for (int i = 0; i < n; i++)
    for (int j = coeff[i]; j <= rhs; j++)
        dp[j] += dp[j - coeff[i]];

    return dp[rhs];
}

// Driver code
public static void main (String[] args)
{
    int coeff[] = {2, 2, 5};
    int rhs = 4;
    int n = coeff.length;
    System.out.print(countSol(coeff, n, rhs));
}

}

// This code is contributed by Anant Agarwal

Python3

A Dynamic Programming based

Python program to find number

of non-negative solutions for

a given linear equation

Returns count of solutions for given

rhs and coefficients coeff[0...n-1]

def countSol(coeff, n, rhs):

# Create and initialize a table
# to store results of subproblems
dp = [0 for i in range(rhs + 1)]
dp[0] = 1

# Fill table in bottom up manner
for i in range(n):
    for j in range(coeff[i], rhs + 1):
        dp[j] += dp[j - coeff[i]]

return dp[rhs]

Driver Code

coeff = [2, 2, 5] rhs = 4 n = len(coeff) print(countSol(coeff, n, rhs))

This code is contributed

by Soumen Ghosh

C#

// A Dynamic programming based // C# program to find number of // non-negative solutions for a // given linear equation using System;

class GFG { // Returns count of solutions // for given rhs and coefficients // coeff[0..n-1] static int countSol(int []coeff, int n, int rhs) {

    // Create and initialize a 
    // table to store results
    // of subproblems
    int []dp = new int[rhs + 1];
    
    // Arrays.fill(dp, 0);
    dp[0] = 1;

    // Fill table in
    // bottom up manner
    for (int i = 0; i < n; i++)
    for (int j = coeff[i]; j <= rhs; j++)
        dp[j] += dp[j - coeff[i]];

    return dp[rhs];
}

// Driver code
public static void Main ()
{
    int []coeff = {2, 2, 5};
    int rhs = 4;
    int n = coeff.Length;
    Console.Write(countSol(coeff, 
                           n, rhs));
}

}

// This code is contributed // by shiv_bhakt.

PHP

n,n, n,rhs) { // Create and initialize a table // to store results of subproblems $dp = str_repeat ("\0", 256); $dp[0] = 1; // Fill table in // bottom up manner for ($i = 0; i<i < i<n; $i++) for ($j = coeff[coeff[coeff[i]; j<=j <= j<=rhs; $j++) dp[dp[dp[j] = dp[dp[dp[j] + ($dp[$j - coeff[coeff[coeff[i]]); return dp[dp[dp[rhs]; } // Driver Code $coeff = array(2, 2, 5); $rhs = 4; // n=count(n = count(n=count(coeff); n=sizeof(n = sizeof(n=sizeof(coeff) / sizeof($coeff[0]); echo countSol($coeff, n,n, n,rhs); // This code is contributed // by shiv_bhakt. ?>

JavaScript

`

Output :

3

Time Complexity: O(n * rhs)

Auxiliary Space: O(rhs) , because of the size of dp used.