贪婪算法返回的数量对于小值而言太大,但对于大值而言不是

时间:2019-05-16 21:05:46

标签: c while-loop greedy

我正在编写一个贪心算法(已经使我头疼不已),该算法输出可用于某些货币值的最小数量的硬币,最终我得到了满意的代码,或者以为如此。输入值.41时,我返回了正确的4 coins-但是,输入.01返回了2 coins,我不知道为什么。

// declare variable change_owed, num_coins, and input globally
float change_owed = 0;
float dollars;
int cents;
int num_coins;

int main(void)
{
    // makes sure the input is non-negative
    do
    {
        dollars = get_float("Change owed:\n");
        cents = round(dollars * 100);
    }
    while(cents <= 0);

    // begin checking 


        while(cents - 25 >= 0) // quarters
        {
            num_coins++; // number of coins used, to be printed later, is incremented
            cents = cents - 25; // coin is subtracted from total
        }
        while(cents - 10 >= 0) // dimes
        {
            num_coins++;
            cents = cents >= 10;
        }   
        while(cents - 5 >= 0) // nickels
        {
            num_coins++;
            cents = cents - 5;
        } 
        while(cents >= 0) // pennies
        {
            num_coins++;
            cents = cents - 1;
        } 

    printf("%i coins\n", num_coins);
}

2 个答案:

答案 0 :(得分:2)

主要问题(减少一枚硬币):

while(cents >= 0) // pennies

应该是

while (cents - 1 >= 0) // or even better: while (cents >= 1)

还有一个错字:

cents = cents >= 10;

应该是

cents = cents - 10; // or even better: cents -= 10;

答案 1 :(得分:1)

据我所知,您尚未初始化 num_coins

int num_coins = 0;

您为什么使用while循环?整数算术同样容易。由于 cents 是一个整数,因此将其除以另一个整数将仅返回整数部分(有效地四舍五入)。

num_coins = cents / 25; // returns the integer part, count of quarters
                        // This is an alternative to initialization
cents %= 25; // modulus operator returns the remainder
num_coins = num_coins + cents / 10; // count of dimes
cents %= 10;
num_coins = num_coins + cents / 5; // count of nickles
cents %= 5;
num_coins += cents; // cents must equal number of pennies required.

好的,我没有测试上面的代码,所以可能会有一些错误,但是您明白了。