【发布时间】:2018-03-21 01:51:12
【问题描述】:
我在为以下问题想出一个可行的算法时遇到了一些麻烦。
给定 100、50、25 和 10 美分的可用硬币数量,我需要找到如何将这些硬币组合成给定值 x。 (不一定是最优的,可用硬币的任何组合都可以)。
到目前为止,我已经得到了这段代码,它只适用于某些情况。
struct coins{
int valor;
int quant;
};
int change = 0;
int changecoins[4] = {0};
struct coins available_coins[4] = { 0 };
moedas_disp[3].value = 10; //10 cents coins
moedas_disp[2].value = 25; //25 cents coins
moedas_disp[1].value = 50; //50 cents coins
moedas_disp[0].value = 100; //100 cents coins
//quantity values just for test purposes
moedas_disp[3].quant = 10; //10 cents coins
moedas_disp[2].quant = 15; //25 cents coins
moedas_disp[1].quant = 8; //50 cents coins
moedas_disp[0].quant = 12; //100 cents coins
for(int i=0; i<4; i++){
while((change/available_coins[i].value>0)&&(available_coins[i].quant>0)){
change -= available_coins[i].value;
available_coins[i].quant--;
changecoins[i]++;
}
}
if(change>0){
printf("It was not possible to change the value");
}
else{
printf("Change:\n");
printf("\t%d 100 cent coin(s).\n", changecoins[0]);
printf("\t%d 50 cent coin(s).\n", changecoins[1]);
printf("\t%d 25 cent coin(s).\n", changecoins[2]);
printf("\t%d 10 cent coin(s).\n", changecoins[3]);
}
但是对于像 30 这样的数量,这将不起作用。该程序将适合 1 个 25 美分的硬币,但剩下 5 美分,这将无法计算。 40、65 等也会出现这种情况。
提前致谢!
【问题讨论】:
-
使用调试器单步调试代码,看看它在哪里没有按您的预期工作。
-
听起来你可能需要学习如何使用调试器来单步调试你的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。延伸阅读:How to debug small programs
-
我认为不是某些行特别是错误的,而是算法逻辑。而且我想不出一个适用于 100% 案例的逻辑。 (我已经尝试了很长时间)
-
正如我们所说,使用调试器单步调试代码,看看它在哪里没有按您的预期工作。调试器为您工作,就像它为我们工作一样,这是一个极好的学习机会。学习使用调试器永远不会太早,调试器是开发人员工具箱中最强大的工具之一。就逻辑而言,抓起一张纸和铅笔并完成它。你是怎么做到的?
-
解决问题的好方法还可以处理无法更改输入值的情况(例如 15 美分)。此外,请注意任何可以使用 100 美分硬币或 50 美分硬币制作的价值都可以使用 10 美分硬币制作。因此,考虑只用 10 美分硬币和 25 美分硬币找零的更简单情况会有所帮助。优化可以稍后进行。
标签: c algorithm coin-change