2011-03-08 209 views
0

是的我知道有類似的帖子,但通過他們看後,我仍然卡住,因爲我很新的編程,沒有給出的答案是足夠具體的我的問題來幫助。算法的最小變化量


問題。 編寫一個高效的ACL(算法計算機語言)算法,給定一個項目的成本(小於或等於一美元),給出購買者50美分,20美分,10美分,5美分和1美分硬幣的數量如果他們交了一美元就會收到。您必須儘量減少更改中的硬幣數量。


問題是不與任何具體的編程語言,答案只能用簡單的ACL語言一樣,如果,如果其他,while循環而不能使用數組或其他高級命令。

這是我在這裏:

輸入代碼在這裏改變

{ 
    int cost, fifty, twenty, ten, five, one; 

    fifty = 0; 
    twenty = 0; 
    ten = 0; 
    five = 0; 
    one = 0; 

    read (cost); 
    if (cost <= 50) 
    { 
     fifty = 1; 
的算法最小量

完成的代碼,謝謝你們的幫助!如果您看到任何含糊之處或可以幫助我簡化代碼,請讓我知道。


Algorithm how much change 
{ 
    int cost, change, fifty, twenty, ten, five, one; 

    fifty = 0; 
    twenty = 0; 
    ten = 0; 
    five = 0; 
    one = 0; 

    read (cost); 
    change = 100 - cost; 

    if (change >= 50) 
    { 
     fifty = fifty + 1; 
     change = change - 50; 
    } 
    while (change >= 20) 
    { 
     twenty = twenty + 1; 
     change = change - 20; 
    } 
    while (change >= 10) 
    { 
     ten = ten + 1; 
     change = change - 10; 
    } 
    while (change >= 5) 
    { 
     five = five + 1; 
     change = change - 5; 
    } 
    while (change >= 1) 
    { 
     one = one + 1; 
     change = change - 1; 
    } 

    print(one, five, ten, twenty, fifty); 
} 
+0

20分?出於好奇,我們在這裏用什麼貨幣?我不確定誰有20美分。或者那個價值只是假設? (或者它是一個錯字) – nzifnab 2011-03-08 07:43:33

+2

很多貨幣做afaik。大多數貨幣都以這些比例出現(1-2-5),並且您有5-10-25-50-100-250-500個硬幣或1-2-5-10-20-50-100-200個硬幣。至少歐元具有後者的配置。 – markijbema 2011-03-08 07:46:47

+0

@nzifnab:可能是歐元。 – 2011-03-08 07:50:23

回答

2

實際上,成本> =要(超過1美元的情況下)只檢查一次50需要,但是這是比較通用的

while (cost >= 50) 
{ 
fifty++; 
cost -= 50; 
} 
while (cost >= 20) 
{ 
twenty++; 
cost -=20; 
} 
... 
+1

我寧願'五十=地板(成本/ 50)'等 – 2011-03-08 07:49:14

+0

謝謝你MByD,必須谷歌什麼++和 - =是:S因爲我們沒有學到,只能用​​在我們的答案我們有什麼學到了。如果您發現任何含糊不清之處,請將我的完成代碼發佈到答案中,請讓我知道謝謝。 – 2011-03-08 08:35:18

+0

其實,我會推薦使用Space_C0wb0y建議的方法: 'fifty = cost/50; 成本=成本%50; 20 =成本/ 20; 成本=成本%20;' 等當%給出餘數。 – MByD 2011-03-08 08:54:53

1

因爲這聽起來像功課我不會馬上給出答案,但給你一個正確的方向提示。

假設你是程序中的某一點。你有一定的金額返回,比方說80美分。你會如何去得到一個硬幣,你肯定必須返回?

2

對於您的特定更改金額,我相信一個簡單的貪婪天真的「挑選最大的,直到我不能再」策略將工作。

例:

  1. 我多少50的可50年代的量前挑比變化量更大?跟蹤這個數字50年代的,從總
  2. 重複了20年代,10的減去金額等

然而,它並不總是遵循貪心方法會奏效。對於「一般」解決方案,請參閱Coin Change - Algorithmist

+0

你能解釋一下你如何得出這是NP-complete? – 2011-03-08 07:48:24

+0

哎呀,我覺得我一定很累了(凌晨1點不是那麼晚了,是嗎?)因爲我的意思是這是一個貪婪的方法會起作用的情況。已更改帖子以反映此情況。 – helloworld922 2011-03-08 07:55:03

+1

根據[Wolfram](http://mathworld.wolfram.com/CoinProblem.html),這個問題僅被證明是NP-Hard,不完整。 – 2011-03-08 07:59:56

1

提示:從最大的硬幣開始,找出可以使用的硬幣的最大數量,然後轉到第二大硬幣並重復。看起來他們通過使用二十個硬幣而不是二十五個哈利來讓你更容易。

0

enter image description here

more detailed: 

enter image description here

and even a brute force algorithm which is O(d M^d) 

enter image description here
This is fromMax Alekseyev, University of South Carolina cse

+1

你從哪裏得到這些信息?如果您沒有自己製作,請引用來源。 – 2011-03-08 07:53:19