📌  相关文章
📜  Frobenius硬币问题

📅  最后修改于: 2021-05-04 17:38:14             🧑  作者: Mango

分别给定两个面额为“ X”和“ Y”的硬币,找到使用这两个硬币无法获得的最大金额(假设无限量供应硬币),然后找到无法获得的金额的总数,如果不存在这样的值,则打印出来“ NA”。

例子 :

Input : X=2, Y=5  
Output: Largest amount = 3
        Total count  = 2
We cannot represent 1 and 3 from infinite supply
of given two coins. The largest among these 2 is 3.
We can represent all other amounts for example 13
can be represented 2*4 + 5.

Input : X=5, Y=10
Output: NA
There are infinite number of amounts that cannot
be represented by these two coins.

我们强烈建议您单击此处并进行实践,然后再继续解决方案。

一个重要的观察结果是,如果X和Y的GCD不为1,则可以由给定的两个硬币形成的所有值都是GCD的倍数。例如,如果X = 4并且Y =6。那么所有值都是2的倍数。因此,不是2的倍数的所有值都不能由X和Y形成。因此,存在无限多个不能由4和D形成的值。 6,我们的答案变为“不适用”。

n个硬币的一般问题称为经典Forbenius硬币问题。

When the number of coins is two, there is 
explicit formula if GCD is not 1. The formula
is:
  Largest amount A = (X * Y) - (X + Y)
  Total amount = (X -1) * (Y - 1) /2 
 

因此,我们现在可以按照以下步骤轻松地回答上述问题:

  1. 计算X和Y的GCD
  2. 如果GCD为1,则所需的最大数量为(X * Y)-(X + Y),总计数为(X-1)*(Y-1)/ 2
  3. 其他打印“ NA”

    下面是基于相同的程序。

    C++
    // C++ program to find the largest number that
    // cannot be formed from given two coins
    #include 
    using namespace std;
      
    // Utility function to find gcd
    int gcd(int a, int b)
    {
        int c;
        while (a != 0)
        {
            c = a;
            a = b%a;
            b = c;
        }
        return b;
    }
      
    // Function to print the desired output
    void forbenius(int X,int Y)
    {
        // Solution doesn't exist 
        // if GCD is not 1
        if (gcd(X,Y) != 1)
        {
            cout << "NA\n";
            return;
        }
      
        // Else apply the formula
        int A = (X*Y)-(X+Y);
        int N = (X-1)*(Y-1)/2;
      
        cout << "Largest Amount = " << A << endl;
        cout << "Total Count = " << N << endl;
    }
      
    // Driver Code
    int main()
    {
        int X = 2,Y = 5;
        forbenius(X,Y);
      
        X = 5, Y = 10;
        cout << endl;
        forbenius(X,Y);
        return 0;
    }


    Java
    // Java program to find the largest
    // number that cannot be formed 
    // from given two coins
    import java.io.*;
      
    class GFG
    {
    // Utility function to find gcd
        static int gcd(int a, int b)
        {
            int c;
            while (a != 0)
            {
                c = a;
                a = b % a;
                b = c;
            }
            return b;
        }
      
        // Function to print the
        // desired output
        static void forbenius(int X, 
                              int Y)
        {
            // Solution doesn't exist 
            // if GCD is not 1
            if (gcd(X, Y) != 1)
            {
                System.out.println( "NA");
                return;
            }
          
            // Else apply the formula
            int A = (X * Y) - (X + Y);
            int N = (X - 1) * (Y - 1) / 2;
          
            System.out.println("Largest Amount = " + A );
            System.out.println("Total Count = " + N );
        }
          
        // Driver Code
        public static void main(String[] args)
        {
            int X = 2,Y = 5;
            forbenius(X, Y);
            X = 5;
            Y = 10;
            System.out.println();
            forbenius(X, Y);
              
        }
    }
      
    // This code is contributed by Sam007


    Python3
    # Python3 program to find the largest 
    # number that cannot be formed
    # from given two coins
      
    # Utility function to find gcd
    def gcd(a, b):
        while (a != 0):
            c = a;
            a = b % a;
            b = c;
          
        return b;
      
    # Function to print the desired output
    def forbenius(X, Y):
      
        # Solution doesn't exist 
        # if GCD is not 1
        if (gcd(X, Y) != 1):
            print("NA");
            return;
      
        # Else apply the formula
        A = (X * Y) - (X + Y);
        N = (X - 1) * (Y - 1) // 2;
      
        print("Largest Amount =", A);
        print("Total Count =", N);
      
    # Driver Code
    X = 2; 
    Y = 5;
    forbenius(X, Y);
      
    X = 5; 
    Y = 10;
    print("");
    forbenius(X, Y);
      
    # This code is contributed by mits


    C#
    // C# program to find the largest
    //  number that cannot be formed 
    // from given two coins
    using System;
      
    class GFG
    {
    // Utility function to find gcd
        static int gcd(int a, int b)
        {
            int c;
            while (a != 0)
            {
                c = a;
                a = b%a;
                b = c;
            }
            return b;
        }
      
        // Function to print the
        // desired output
        static void forbenius(int X, int Y)
        {
            // Solution doesn't exist 
            // if GCD is not 1
            if (gcd(X,Y) != 1)
            {
                Console.WriteLine( "NA");
                return;
            }
          
            // Else apply the formula
            int A = (X * Y) - (X + Y);
            int N = (X - 1) * (Y - 1) / 2;
          
            Console.WriteLine("Largest Amount = " + A );
            Console.WriteLine("Total Count = " + N );
        }
          
          
          
      
        // Driver Code
        public static void Main()
        {
            int X = 2,Y = 5;
            forbenius(X,Y);
            X = 5;
            Y = 10;
            Console.WriteLine();
            forbenius(X,Y);
          
        }
    }
          
    // This code is contributed by Sam007


    PHP


    输出 :

    Largest Amount = 3
    Total Count = 2
    
    NA
    

    参考:
    https://zh.wikipedia.org/wiki/硬币问题