购买时提供的现金数量最少

时间:2016-03-17 18:25:45

标签: algorithm matlab

我最近发现了一个问题如下: -

所以一个程序必须接受一个数字,然后它告诉从该数字返回的最少数量的硬币,纸币和美分。

笔记可以是25,50,100,200 硬币可以是1,5,20 美分可以是5,20,50

说你输入290,它应该返回(200 * 1),(50 * 1),(20 * 2)

它应该在matlab中完成,但是这不是限制,我只是想知道如何继续,我已经能够获得金额,但它不是最少数量的笔记,硬币或美分。

function y = functest(purchase)
purchase = 500 - purchase;
values = [200,100,50,25,20,5,1,0.5,0.2,0.05];
data = ['note','note''note','note','coin','coin','coin','cent','cent','cent'];
returnval = [0,0,0,0,0,0,0,0,0,0];
position=1;
    while( position <= length(values) )       
         if purchase - values(position) > 0
             returnval(position) = returnval(position) +1;
             purchase = purchase - values(position);
         else
             position = position + 1;
         end
    end
    allOneString = sprintf('%.0f,' , returnval);
    allOneString = allOneString(1:end-1);% strip final comma
     fprintf('value of a: %s\n', allOneString);
end

3 个答案:

答案 0 :(得分:0)

我认为像这样简单的事情会给你正确答案吗?

data = {'note','note''note','note','coin','coin','coin','cent','cent','cent'};
purchase = 500 - purchase;
values = [200,100,50,25,20,5,1,0.5,0.2,0.05];
remainder = purchase;
for t = 1:size(values,2)
   res(t) = floor(remainder / values(t));
   remainder = remainder - res(t)*values(t);
end
notenumber = res(find(res>0));
notesize = values(find(res>0));
notetype = data(find(res>0));
for g = 1:size(find(res>0),2)
   sprintf('%.0f, %.0f, %s' , notenumber(g), notesize(g), char(notetype(g)));
end


>>
   '2, 200, note'    '1, 50, note'    '1, 5, coin'

答案 1 :(得分:0)

你让阵列混淆了你。这是一项主要是分析的测试。

你有三类面额。它们是“Notes”,“Coins”,“Cents”。

由于这些中没有一个包含相同的值,我们可以使用除法并存储余数。我不会给你准确的代码,但我会给你一个PC的例子,我想你会明白我的意思。

Given = 590.53

double remainder = 0
note200 = Floor(Given / 200) //2
remainder = Given % 200 //remainder of 190.53
note100 = Floor(remainder / 100) //1
remainder = remainder % 100 //90.53
etc etc etc. 

如果您正确计划,这也是递归的一个很好的例子。这将允许您在现有数组中运行循环以匹配数据。 public string calcFunction(denomValue,amount)

最终,你最终得到2 200,1 100,1 150,1 25,4 5个硬币,1 0.5美分,如果它们存在3 0.1美分,但我不会在你的清单中看到它。

答案 2 :(得分:0)

它首先看起来更难。我知道这是如何工作的:

从最小的分数开始,并计算它们的回报值:

在您的示例中:290 -> (5800*0.05)

然后将它们总是组合到下一个更高的值,因此您没有提醒:

(5800*0.05) -> (1450*0.20) -> (580*0.50) -> ... -> (58*5) -> (14*20) + (2*5) -> ... -> 

那将是你的解决方案     (1 * 200)+(4 * 20)+(2 * 5)

至少你必须尝试找到其余部分的组合(我知道,这实现起来有点复杂):(2*20)+(2*5) -> (1*50)

(1*200) + (4*20) + (2*5) -> (1*200) + (1*50) + (2*20)