我正在尝试解决这个问题,我需要模拟一种 atm 提现。该程序将询问 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 循环的范围。再一次,我将把它留给你作为练习。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句