C/C++ 贪婪算法程序用于查找最少硬币数量

cc++server side programmingprogramming

贪婪算法是一种用于为给定问题寻找最佳解决方案的算法。贪婪算法通过寻找每个部分的局部最优解(问题一部分的最优解)来工作,从而表明可以找到全局最优解。

在这个问题中,我们将使用贪婪算法来查找可以构成给定总和的最少硬币/纸币数量。为此,我们将考虑所有有效的硬币或纸币,即面值为 { 1, 2, 5, 10, 20, 50 , 100, 200 , 500 ,2000 }。我们需要返回需要凑足总和的硬币/纸币的数量。

让我们举几个例子来更好地理解上下文 −

示例 1 −

输入:1231
输出:7

解释 − 我们需要两张 500 卢比的纸币、两张 100 卢比的纸币、一张 20 卢比的纸币、一张 10 卢比的纸币和一枚 1 卢比的硬币。总计为 2+2+1+1+1 = 7

示例 2 −

输入:2150
输出:3

解释 −我们需要一张 2000 卢比的钞票、一张 100 卢比的钞票和一张 50 卢比的钞票。

要使用贪婪算法解决这个问题,我们将找到可以使用的最大面额。然后我们将从总和中减去最大面额,并再次执行相同的过程,直到总和变为零。

算法

输入:总和,
初始化硬币 = 0
步骤 1:找到可以使用的最大面额,即小于总和。
步骤 2:将两枚硬币的面额相加并从总和中减去
步骤 3:重复步骤 2,直到总和变为 0。
步骤 4:打印硬币中的每个值。

示例

#include <bits/stdc++.h>
使用命名空间 std;
int notes[] = { 1, 2, 5, 10, 20, 50, 100, 200, 500, 2000 };
int n = sizeof(notes) / sizeof(notes[0]);
void minchange(int sum){
   vector<int> coins;
    for (int i = n - 1; i >= 0; i--) {
      while (sum >= notes[i]) {
         sum -= notes[i];
         coins.push_back(notes[i]);
      }
   }
   for (int i = 0; i < coins.size(); i++)
      cout << coins[i] << "\t";
}
int main(){
   int n = 3253;
   cout << "总计 << n << "的最小硬币/纸币数量为 \t ";
   minchange(n);
   return 0;
}

输出

总计为 3253 的硬币/纸币数量为
2000 500 500 200 50 2 1

相关文章