给定一个值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。
算法:
- 按降序对硬币阵列进行排序。
- 将结果初始化为空。
- 查找小于当前数量的最大面额。
- 将找到的面额添加到结果中。从金额中减去找到的面额的价值。
- 如果数量变为0,则打印结果。
- 否则,对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。
对于一般输入,可以使用以下动态编程方法:
查找可产生给定值的最小硬币数量