我需要编写一个程序,使用强力方法来找出如何最有效地进行更改。我有点困惑,如果我走在正确的轨道上,我很好奇。我是用C语言写的。
它不使用贪心算法。
这让我很困惑。最后,它应按顺序输出最有效的变化,如toonie,loonie,quarter,dimes,nickels,pennies。 (如1 1 0 0 1 0。)
我是否在正确的轨道上?我对我正在做的事情感到有点困惑,六个for循环显然是关键,我正在添加每个迭代,但至于概念上发生了什么我有点困惑。
#include <stdio.h>
int main(int argc, char *argv[]) {
//Input
int amount = 336;
int bestSolution = amount;
//Coins
int toonies = 0, loonies = 0, quarters = 0, dimes = 0, nickels = 0, pennies = 0;
int amountAfterToonies, amountAfterLoonies, amountAfterQuarters, amountAfterDimes, amountAfterNickels;
//Counters
int i, j, k, l, m, n;
for (i = 0; i < amount / 200; i++) { //Finds amount
toonies++;
amountAfterToonies = amount % 200;
for (j = 0; j < amountAfterToonies / 100; j++) {
loonies++;
amountAfterLoonies = amountAfterToonies % 100;
for (k = 0; k < amountAfterLoonies / 25; k++) {
quarters++;
amountAfterQuarters = amountAfterLoonies % 25;
for (l = 0; l < amountAfterQuarters / 10; l++) {
dimes++;
amountAfterDimes = amountAfterQuarters % 10;
for (m = 0; m < amountAfterDimes / 5; m++) {
nickels++;
amountAfterNickels = amountAfterDimes % 5;
for (n = 0; n < amountAfterNickels; n++) {
pennies++;
sum = toonies + loonies + quarters + dimes + nickels + pennies;
if (sum < bestSolution) {
bestSolution = sum;
}
}
}
}
}
}
}
printf("%d %d %d %d %d %d\n", toonies, loonies, quarters, dimes, nickels, pennies);
printf("%d\n", bestSolution);
return 0;
}
答案 0 :(得分:3)
您找不到最有效的方法。你找到各种方法。
我建议你这样的事情:
toonies=amount/200;
amount%=200;
loonies=amount/100;
amount%=100;
//and so on
(即使你想保留循环,将它们分开 - 没有理由使用嵌套循环)
答案 1 :(得分:0)
算法取决于“贪婪”算法是否有效。贪婪在美国工作,我认为在加拿大,但不会奏效,例如,如果有15美分或3美元的账单。
对于“贪婪”,您获取收到的更改总金额,重复减去最大的账单/硬币,直到金额小于账单/硬币值,然后减少到下一个较小的账单/硬币。
有几种方法,但它可以在两个嵌套循环和一个包含bill / coin值的数组中有效地完成。或者你可以有N个连续循环,每个钞票/硬币值一个。在这种情况下,循环不会嵌套。基本上,每个循环都是
while (amountDue >= bill_coin_values[i]) {
bills_coins_to_dispense[i]++;
amountDue -= bill_coin_values[i];
}
(当然,上面的循环可以用模块化部门代替,但是这种问题在这个开发阶段会混淆。)
但是将该循环粘贴在一个循环中,该循环会在值列表中递增i
,并且您必须有两个循环版本。
即,外部循环将类似于:
int numSizes = 7;
int bill_coin_values[] = {200, 100, 50, 25, 10, 5, 1};
int bills_coins_to_dispense[7];
for (int i = 0; i < numSizes; i++) {
bills_coins_to_dispense[i] = 0;
<Above loop>
}
答案 2 :(得分:0)
您的解决方案将找到所有可能的解决方案。
最高效的是什么意思?
您需要添加的步骤是记录您认为最有效的解决方案,并将其作为最后的答案。
修改 - 更正;你是在正确的轨道,但如果你追踪你第一次发布的逻辑,你会发现你永远不会添加便士。这是因为在实际获得有效结果的第一次迭代中,amountAfterDimes / 5
为0,因此您永远不会添加任何便士,因此永远找不到正确的答案。
您需要允许您的搜索尝试每个硬币的0,以允许它下降到正确的答案。
答案 3 :(得分:0)
也许是Loonies和Toonies加入了失眠症......但是如果不回答这太有趣了......
#include <stdio.h>
struct coin {
char *name;
int value;
int number;
};
#define NUMCOINS 7
int main(int argc, char *argv[]) {
//Input
int amount = 336;
//Coins
struct coin coins[NUMCOINS]={{"toonies", 200, 0},{"loonies",100,0},{ "four bit", 50,0},{ "two bit", 25,0},{"short bit",10,0},{ "nickels",5,0},{"pennies",1,0}};
//Counters
int i;
for(i=0;i<NUMCOINS;i++)
for (;amount >= coins[i].value; amount-=coins[i].value,coins[i].number++);
for(i=0;i<NUMCOINS;i++)
printf("%s %d \n", coins[i].name, coins[i].number);
return 0;
}