亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

貪心算法無法正常運行

貪心算法無法正常運行

互換的青春 2022-10-18 16:55:55
這段代碼應該給我最少數量的硬幣(25 美分硬幣、5 美分硬幣、5 美分硬幣和 1 美分硬幣),這些硬幣加起來等于所欠的金額。當我輸入的值是 0.25 的倍數時,它可以無縫工作。但是當我在終端中輸入其他值時,它只是插入一個新行而不做任何事情。我怎么搞砸了?owed = float(input("how much change is owed?"))coins = 0if owed % 0.25 == 0:    coins = owed / 0.25    print(int(coins))    exit()elif owed % 0.25 != 0:    while owed > 0:        if (owed - 0.25) >= 0:            coins += 1            owed -= 0.25        elif (owed - 0.10) >= 0:            coins += 1            owed -= 0.10        elif (owed - 0.05) >= 0:            coins += 1            owed -= 0.05        elif (owed - 0.01) >= 0:            coins += 1            owed -= 0.01    print(int(coins))    exit()
查看完整描述

2 回答

?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

while由于浮點數的內部表示引起的與浮點值相關的一些舍入錯誤,您的程序正在運行無限循環。因此,要修復這些錯誤,我們可以使用round()函數在每次循環迭代owed結束時對值進行四舍五入:while


elif owed % 0.25 != 0:

    while owed > 0:

        if (owed - 0.25) >= 0:

            coins += 1

            owed -= 0.25

        elif (owed - 0.10) >= 0:

            coins += 1

            owed -= 0.10

        elif (owed - 0.05) >= 0:

            coins += 1

            owed -= 0.05

        elif (owed - 0.01) >= 0:

            coins += 1

            owed -= 0.01

        owed = round(owed, 3) # In this line, we roundoff the value of owed

    print(int(coins))

    exit()

這很好用。


希望這可以幫助 :)


查看完整回答
反對 回復 2022-10-18
?
浮云間

TA貢獻1829條經驗 獲得超4個贊

while由于浮點錯誤,您的程序卡在循環中。嘗試在while循環中添加以下代碼,您會看到 whileowed確實變得無限小,它永遠不會變為零:


...

while owed > 0:

    print(owed)

    ...


輸出:


...

8.326672684688674e-17

8.326672684688674e-17

8.326672684688674e-17

8.326672684688674e-17

...

考慮將輸入乘以100然后將其作為整數處理:


owed = int(float(input("How much change is owed? $")) * 100)


quarters = int(owed / 25)

dimes = int((owed - quarters * 25) / 10)

nickels = int((owed - quarters * 25 - dimes * 10) / 5)

cents = int((owed - quarters * 25 - dimes * 10 - nickels * 5))


coins = (quarters + dimes + nickels + cents)


print('Quarters (${}): {}'.format(quarters*0.25, quarters))

print('Dimes (${}): {}'.format(dimes*0.1, dimes))

print('Nickels (${}): {}'.format(nickels*0.05, nickels))

print('Cents (${}): {}'.format(cents, cents))

print('Coins:', coins)

或者,如果您想堅持使用貪心算法:


owed = int(float(input("How much change is owed? $")) * 100)


while owed > 0:

    if (owed - 25) >= 0:

        coins += 1

        owed -= 25

    elif (owed - 10) >= 0:

        coins += 1

        owed -= 10

    elif (owed - 5) >= 0:

        coins += 1

        owed -= 5

    elif (owed - 1) >= 0:

        coins += 1

        owed -= 1


coins = (quarters + dimes + nickels + cents)


print('Quarters (${}): {}'.format(quarters*0.25, quarters))

print('Dimes (${}): {}'.format(dimes*0.1, dimes))

print('Nickels (${}): {}'.format(nickels*0.05, nickels))

print('Cents (${}): {}'.format(cents, cents))

print('Coins:', coins)

輸出


>>> How much change is owed? $1.42

Quarters ($1.25): 5

Dimes ($0.1): 1

Nickels ($0.05): 1

Cents ($2): 2

Coins: 9

有關浮點限制的更多信息,請查看以下內容:https ://docs.python.org/3.8/tutorial/floatingpoint.html


查看完整回答
反對 回復 2022-10-18
  • 2 回答
  • 0 關注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號