CS50贪心算法

CS50 greedy algorithm

我刚开始使用 cs50 进行 C 编程。

我试过做贪心算法的习题集,但是好像找不到bug。我的代码如下。

#include <cs50.h>
#include <stdio.h>
#include <math.h>


int main (void)
{

int count = 0;

printf("how much is the change?: ");

float change = get_float();

while(change < 0)
{
   printf("change is to be more than 0");
   change = get_float();
 }

int amount = lroundf(change*100);

while(amount > 0)
{
  if ((amount-25) >= 25)
  {
      amount  =  amount - 25;
      count++;
  }

  else if ((amount-10) >= 10)
  {
      amount =  amount - 10;
      count++;
  }

  else if ((amount-5) >= 5)
  {
      amount = amount -5;
      count++;
  }

  else if((amount-1) >= 1)
  {
      amount = amount -1;
      count ++;
      break;
  }

  else
  {
   printf("you have no change \n");   
  }
  }
  printf("your number of coins is %i\n", count);

  }

当我输入找零时,我得到了 8 个硬币。似乎无法找到错误所在。谁能帮帮我?

首先,您可以尝试 运行 您的程序使用 change 的值 return 简单的答案,例如 1 个硬币,例如,使用 change = 0.25。如果可行,那么您应该开始尝试使用一些硬币,重复一种类型,就像您对 1.00 所做的那样,或者加入几种类型,例如 0.06 。然后,尝试更大的数字和浮动不准确度更高的值,例如 4.10。按照此操作应该会引导您找到答案。

如果在尝试之后仍然找不到问题,那么答案是:问题出在 if/else if 表达式上。例如,当您尝试计算四分之一时,(amount-25) >= 25 无法正常工作。当 amount 大于或等于 25 时,您正试图减去四分之一,但您的代码只是这样做,直到它小于 50。开发您的表达式可能会帮助您看到它:(amount-25) >= 25 -> (amount-25) + 25 >= 25 + 25 -> amount >= 50.

您可能会发现另一个问题是 break 语句。它可能比预期更早地退出循环。如果您尝试 运行 个数字,例如 0.040.03,您会看到计数停留在 1。删除第一分钱后,代码跳出循环,留下 amount 仍然大于 0。break 使得代码跳出循环变得更难看清,这就是为什么许多程序员建议尽可能避免它。