简单的贪心算法。无限循环

时间:2013-09-02 20:44:00

标签: c++ algorithm

我写了一个简单的贪婪算法,但不知何故它不起作用。

#include <stdio.h>
#include <iostream>
#include <conio.h>

int main(void)
{
    float change;
    std::cout << "Change: ";
    std::cin >> change;
    int quantity = 0;
    while(change > 0.0){
        if(change >= 0.5){
            change -= 0.5;
        }
        else if(change >= 0.25){
            change -= 0.25;
        }
        else if(change >= 0.1){
            change -= 0.1;
        }
        else if(change >= 0.05){
            change -= 0.05;
        }
        else if(change >= 0.01){
            change -= 0.01;
        }
        quantity++;
        std::cout << change << std::endl;
    }
    std::cout << quantity << std::endl;
    _getch();
    return 0;
}

虽然它适用于0.5和0.25,但它不适用于0.01或0.1。 (看起来它会返回一些非常小的数字) 我看不出问题出在哪里。

// EDIT 将所有内容转换为int值以避免下面提到的问题Zeno

2 个答案:

答案 0 :(得分:4)

问题是基本的:0.5,0.25,0.125,......是'精确'浮点数0.1,0.01不是:你比较/减去是错误的。 在集合0.1 ... 0.9中,唯一的“精确”浮点数为0.5。

(所有这些都假定为二进制浮点数)

答案 1 :(得分:0)

当变化介于0.01和0.0之间时,你需要一个案例,也许避免最后的if()?

    else if(change >= 0.05){
        change -= 0.05;
    }
    else /*if(change >= 0.01)*/ {
        change -= 0.01;
    }