我最近发现了一个问题如下: -
所以一个程序必须接受一个数字,然后它告诉从该数字返回的最少数量的硬币,纸币和美分。
笔记可以是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
答案 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)