Check if N can be represented as sum of integers chosen from set {A, B}

Given three integers N, A and B, the task is to find whether N can be represented as sum of A’s and B’s.

Examples:

Input: N = 11, A = 2, B = 3
Output: Yes
2 + 2 + 2 + 2 + 3 = 11

Input: N = 8, A = 3, B = 7
Output: No



Approach: An efficient solution is to call a recursive function starting with zero (because zero is always possible). If function call is fun(x) then recursively call fun(x + a) and fun(x + b) (because if x is possible then x + a and x + b are also possible). Return out of the function if x > n.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find if number N can
// be represented as sum of a's and b's
#include <bits/stdc++.h>
using namespace std;
  
// Function to find if number N can
// be represented as sum of a's and b's
void checkIfPossibleRec(int x, int a, int b,
                   bool isPossible[], int n)
{
    // base condition
    if (x > n)
        return;
  
    // if x is already visited
    if (isPossible[x])
        return;
  
    // set x as possible
    isPossible[x] = true;
  
    // recursive call
    checkIfPossibleRec(x + a, a, b, isPossible, n);
    checkIfPossibleRec(x + b, a, b, isPossible, n);
}
  
bool checkPossible(int n, int a, int b)
{
    bool isPossible[n + 1] = { false };
    checkIfPossibleRec(0, a, b, isPossible, n);
    return isPossible[n];
}
  
// Driver program
int main()
{
    int a = 3, b = 7, n = 8;
    if (checkPossible(a, b, n))
        cout << "Yes";
    else
        cout << "No";
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find if number N can
// be represented as sum of a's and b's
  
import java.util.*;
class solution
{
  
// Function to find if number N can
// be represented as sum of a's and b's
static void checkIfPossibleRec(int x, int a, int b,
                                boolean isPossible[], int n)
{
    // base condition
    if (x > n)
        return;
  
    // if x is already visited
    if (isPossible[x])
        return;
  
    // set x as possible
    isPossible[x] = true;
  
    // recursive call
    checkIfPossibleRec(x + a, a, b, isPossible, n);
    checkIfPossibleRec(x + b, a, b, isPossible, n);
}
  
static boolean checkPossible(int n, int a, int b)
{
    boolean isPossible[]=new boolean[n + 1];
    for(int i=0;i<=n;i++)
    isPossible[i]=false;
    checkIfPossibleRec(0, a, b, isPossible, n);
    return isPossible[n];
}
  
// Driver program
public static void main(String args[])
{
    int a = 3, b = 7, n = 8;
    if (checkPossible(a, b, n))
        System.out.print("Yes");
    else
        System.out.print( "No");
  
}
  
}
//contributed by Arnab Kundu

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find if number N can 
// be represented as sum of a's and b's 
using System;
  
class GFG
{
// Function to find if number N can 
// be represented as sum of a's and b's 
static void checkIfPossibleRec(int x, int a, int b, 
                               bool []isPossible, int n) 
    // base condition 
    if (x > n) 
        return
  
    // if x is already visited 
    if (isPossible[x]) 
        return
  
    // set x as possible 
    isPossible[x] = true
  
    // recursive call 
    checkIfPossibleRec(x + a, a, b, isPossible, n); 
    checkIfPossibleRec(x + b, a, b, isPossible, n); 
  
static bool checkPossible(int n, int a, int b) 
    bool []isPossible = new bool[n + 1]; 
    for(int i = 0; i <= n; i++) 
    isPossible[i] = false
        checkIfPossibleRec(0, a, b, isPossible, n); 
    return isPossible[n]; 
  
// Driver Code 
static public void Main ()
{
    int a = 3, b = 7, n = 8; 
    if (checkPossible(a, b, n)) 
        Console.WriteLine("Yes"); 
    else
        Console.WriteLine( "No"); 
}
}
  
// This code is contributed by Sach_Code

chevron_right


PHP

$n)
return;

// if x is already visited
if ($isPossible == true)
return;

// set x as possible
$isPossible[$x] = true;

// recursive call
checkIfPossibleRec($x + $a, $a, $b,
$isPossible, $n);
checkIfPossibleRec($x + $b, $a, $b,
$isPossible, $n);
}

function checkPossible($n, $a, $b)
{
$isPossible[$n + 1] = array(false);
checkIfPossibleRec(0, $a, $b, $isPossible, $n);
return $isPossible;
}

// Driver Code
$a = 3;
$b = 7;
$n = 8;
if (checkPossible($a, $b, $n))
echo “No”;
else
echo “Yes”;

// This code is contributed by Sach_Code
?>

Output:

No


My Personal Notes arrow_drop_up

pawanasipugmailcom

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : andrew1234, Sach_Code