2011-03-08 196 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