📜  贪婪算法以找到最小数量的硬币

📅  最后修改于: 2021-04-28 17:29:22             🧑  作者: Mango

给定一个值V,如果我们要更改V Rs,并且每种面额的印度货币都有无限的供应量,即我们有{1,2,5,10,20, 50、100、500、1000}枚硬币/纸币,进行更改所需的最小硬币和/或纸币数量是多少?

例子:

Input: V = 70
Output: 2
We need a 50 Rs note and a 20 Rs note.

Input: V = 121
Output: 3
We need a 100 Rs note, a 20 Rs note and a 1 Rs coin.

解决方案:贪婪的方法。
方法:通常的直觉是先取更大价值的硬币。这样可以减少所需硬币的总数。从可能的最大面额开始,然后继续添加面额,而剩余值大于0。

算法:

  1. 按降序对硬币阵列进行排序。
  2. 将结果初始化为空。
  3. 查找小于当前数量的最大面额。
  4. 将找到的面额添加到结果中。从金额中减去找到的面额的价值。
  5. 如果数量变为0,则打印结果。
  6. 否则,对V的新值重复步骤3和4。
C++
// C++ program to find minimum
// number of denominations
#include 
using namespace std;
 
// All denominations of Indian Currency
int deno[] = { 1, 2, 5, 10, 20,
               50, 100, 500, 1000 };
int n = sizeof(deno) / sizeof(deno[0]);
 
void findMin(int V)
{
    sort(deno, deno + n);
 
    // Initialize result
    vector ans;
 
    // Traverse through all denomination
    for (int i = n - 1; i >= 0; i--) {
 
        // Find denominations
        while (V >= deno[i]) {
            V -= deno[i];
            ans.push_back(deno[i]);
        }
    }
 
    // Print result
    for (int i = 0; i < ans.size(); i++)
        cout << ans[i] << " ";
}
 
// Driver program
int main()
{
    int n = 93;
    cout << "Following is minimal"
         << " number of change for " << n
         << ": ";
    findMin(n);
    return 0;
}


C
// C program to find minimum
// number of denominations
#include 
#define COINS 9
#define MAX 20
 
// All denominations of Indian Currency
int coins[COINS] = { 1, 2, 5, 10, 20,
                     50, 100, 200, 2000 };
 
void findMin(int cost)
{
    int coinList[MAX] = { 0 };
    int i, k = 0;
 
    for (i = COINS - 1; i >= 0; i--) {
        while (cost >= coins[i]) {
            cost -= coins[i];
            // Add coin in the list
            coinList[k++] = coins[i];
        }
    }
 
    for (i = 0; i < k; i++) {
        // Print
        printf("%d ", coinList[i]);
    }
    return;
}
 
int main(void)
{
    // input value
    int n = 93;
 
    printf("Following is minimal number"
           "of change for %d: ",
           n);
    findMin(n);
    return 0;
}
// Code by Munish Bhardwaj


Java
// Java program to find minimum
// number of denominations
import java.util.Vector;
 
class GFG
{
 
    // All denominations of Indian Currency
    static int deno[] = {1, 2, 5, 10, 20,
    50, 100, 500, 1000};
    static int n = deno.length;
 
    static void findMin(int V)
    {
        // Initialize result
        Vector ans = new Vector<>();
 
        // Traverse through all denomination
        for (int i = n - 1; i >= 0; i--)
        {
            // Find denominations
            while (V >= deno[i])
            {
                V -= deno[i];
                ans.add(deno[i]);
            }
        }
 
        // Print result
        for (int i = 0; i < ans.size(); i++)
        {
            System.out.print(
                " " + ans.elementAt(i));
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int n = 93;
        System.out.print(
            "Following is minimal number "
            +"of change for " + n + ": ");
        findMin(n);
    }
}
 
// This code is contributed by 29AjayKumar


Python3
# Python3 program to find minimum
# number of denominations
 
def findMin(V):
     
    # All denominations of Indian Currency
    deno = [1, 2, 5, 10, 20, 50,
            100, 500, 1000]
    n = len(deno)
     
    # Initialize Result
    ans = []
 
    # Traverse through all denomination
    i = n - 1
    while(i >= 0):
         
        # Find denominations
        while (V >= deno[i]):
            V -= deno[i]
            ans.append(deno[i])
 
        i -= 1
 
    # Print result
    for i in range(len(ans)):
        print(ans[i], end = " ")
 
# Driver Code
if __name__ == '__main__':
    n = 93
    print("Following is minimal number",
          "of change for", n, ": ", end = "")
    findMin(n)
     
# This code is contributed by
# Surendra_Gangwar


C#
// C# program to find minimum
// number of denominations
using System;
using System.Collections.Generic;
 
class GFG{
 
// All denominations of Indian Currency
static int []deno = { 1, 2, 5, 10, 20,
                      50, 100, 500, 1000 };
static int n = deno.Length;
 
static void findMin(int V)
{
     
    // Initialize result
    List ans = new List();
 
    // Traverse through all denomination
    for(int i = n - 1; i >= 0; i--)
    {
         
        // Find denominations
        while (V >= deno[i])
        {
            V -= deno[i];
            ans.Add(deno[i]);
        }
    }
 
    // Print result
    for(int i = 0; i < ans.Count; i++)
    {
        Console.Write(" " + ans[i]);
    }
}
 
// Driver code
public static void Main(String[] args)
{
    int n = 93;
    Console.Write("Following is minimal number " +
                  "of change for " + n + ": ");
                   
    findMin(n);
}
}
 
// This code is contributed by gauravrajput1


输出:

Following is minimal number of change 
for 93: 50  20  20  2  1

复杂度分析:

  • 时间复杂度: O(V)。
  • 辅助空间: O(1),因为不使用任何附加空间。

注意:以上方法可能不适用于所有面额。例如,它不适用于面额{9,6,5,1}并且V =11。上述方法将打印9、1和1。但是我们可以使用2个面额5和6。
对于一般输入,可以使用以下动态编程方法:
查找可产生给定值的最小硬币数量