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


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find if number N can 
# be represented as sum of a's and b's 
  
# Function to find if number N can 
# be represented as sum of a's and b's 
def checkIfPossibleRec(x, a, b, isPossible, 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) 
  
def checkPossible(n, a, b):
  
    isPossible = [False] * (n + 1
    checkIfPossibleRec(0, a, b, isPossible, n) 
    return isPossible[n] 
  
  
# Driver Code
if __name__ == "__main__":
  
    a, b, n = 3, 7, 8
    if checkPossible(a, b, n): 
        print("Yes"
    else:
        print("No"
  
# This code is contributed by Rituraj Jain

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

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find if number N can
// be represented as sum of a's and b's
// Function to find if number N can
// be represented as sum of a's and b's
function checkIfPossibleRec($x, $a, $b,
                            $isPossible, $n)
{
    // base condition
    if ($x > $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
?>

chevron_right


Output:

No


My Personal Notes arrow_drop_up

Recommended Posts: