我试图解决这个问题,我需要模拟一种atm现金。 该程序将询问3种类型的美元钞票并将其存储在3个不同的托架中,例如海湾1 = 20; bay 2 = 50; bay 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& 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选项做的
答案 0 :(得分:2)
由于您的问题涉及的数字相当少,您可以从强力方法开始,即只需尝试可能范围内的所有组合。
像
#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-loop,因为它完全没必要。我将此作为练习留给您(提示:z
可以直接计算)。
第二步是通过考虑&#34;使用的&#34;来限制第二个for-loop的范围。通过第一个循环。再说一遍,我会把它作为锻炼给你。