我正试图解决这个问题,我需要模拟一种自动取款机提款。
程序将询问3种类型的美元钞票并将其存储在3个不同的隔间中,例如隔间1=20;隔间2=50;隔间3=100;
在程序要求现金出价金额,并给予最多3个选项,如果它是可行的。

For example: cash out amount: U$ 220

A) 2 x U$ 100 + 1 x U$ 20
B) 1 x U$ 100 + 2 x U$ 50 + 1 x U$ 20
C) 4 x U$ 50 + 1 x U$ 20

我在努力寻找一种方法来解决B&C选项,我不知道我是否在隧道里想象我“解决”a选项的方式,因为我觉得必须有一种更简单的方法来计算它
a,b&c变量是一种气泡式的间隔值
 if(cash_out >= a){
      left = total % a; //total = cash_out;
      if(left == 0){
          cont_A = total / a;
      } else {
          cont_A = total / a;
          total = left;
          if(total >= b){
              left = total % b;
              cont_B = total / b;
              total = left;
              if(total != 0){
                  cont_C = total / c;
              }
          } else {
              cont_C = total / c;
          }
      }
 } else if(cash_out >= b){
      left = total % b;
      if(left == 0){
          cont_B = total / b;
          left = total % b;
          if(left == 0){
              cont_C = total / c;
          }
      } else {
          cont_B = total / b;
          total = left;
          if(total >= c){
              cont_C = total / c;
          }
      }
 } else {
       cont_C = total / c;
 }

为了清楚我不是在要求别人帮我解决整个问题,我只是想知道我应该如何处理这个问题
代码就是我为A选项所做的

最佳答案

由于您的问题涉及的数字相当小,您可以从蛮力方法开始,即简单地尝试可能范围内的所有组合。
就像

#include <stdio.h>

int main(void) {
    int bay[3] = {100, 50, 20};
    int cash_out = 220;

    for (int x = cash_out/bay[0]; x >= 0; --x)
    {
        for (int y = cash_out/bay[1]; y >= 0; --y)
        {
            for (int z = cash_out/bay[2]; z >= 0; --z)
            {
                if (cash_out == (x * bay[0] + y*bay[1] + z*bay[2]))
                {
                    printf("%d %d %d\n", x, y, z);
                }
            }
        }
    }
    return 0;
}

这将打印:
2 0 1
1 2 1
1 0 6
0 4 1
0 2 6
0 0 11

当然,像上面这样的暴力方法不是最优的。所以接下来的步骤是优化代码。
第一步是去掉最内部的for循环,因为它是完全不必要的。我把这个留作练习(提示:z可以直接计算)。
第二步是通过考虑第一个循环“使用”的量来限制第二个for循环的范围。再说一遍,我把它留给你练习。

关于c - “atm”模拟器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50769318/

10-11 22:13
查看更多