Algorithm 购买时给予的最小现金数
我最近遇到一个问题如下:- 所以一个程序必须接受一个数字,然后它告诉从这个数字返回的最少数量的硬币、纸币和美分 注释可以是25,50100200 硬币可以是1,5,20 美分可以是5,20,50 假设输入290,它应该返回(200*1)、(50*1)、(20*2) 它应该在matlab中完成,但这不是一个约束条件,我只是想知道如何进行,我已经能够得到数量,但不是最少的纸币、硬币或美分Algorithm 购买时给予的最小现金数,algorithm,matlab,Algorithm,Matlab,我最近遇到一个问题如下:- 所以一个程序必须接受一个数字,然后它告诉从这个数字返回的最少数量的硬币、纸币和美分 注释可以是25,50100200 硬币可以是1,5,20 美分可以是5,20,50 假设输入290,它应该返回(200*1)、(50*1)、(20*2) 它应该在matlab中完成,但这不是一个约束条件,我只是想知道如何进行,我已经能够得到数量,但不是最少的纸币、硬币或美分 function y = functest(purchase) purchase = 500 - purchas
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
函数y=functest(购买)
购买=500-购买;
数值=[200100,50,25,20,5,1,0.5,0.2,0.05];
数据=[“纸币”、“纸币”、“纸币”、“硬币”、“硬币”、“分”、“分”、“分”];
returnval=[0,0,0,0,0,0,0,0,0];
位置=1;
而(位置0)
returnval(position)=returnval(position)+1;
采购=采购-价值(职位);
其他的
位置=位置+1;
结束
结束
allOneString=sprintf('.0f',returnval);
allOneString=allOneString(1:end-1);%带最后一个逗号
fprintf('a的值:%s\n',allOneString);
结束
我认为像这样简单的事情应该会给你正确的答案
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'
我认为像这样简单的事情应该会给你正确的答案
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'
你已经被数组弄糊涂了。这主要是一个分析测试 你有三种面额,它们是“纸币”、“硬币”、“美分” 由于它们中没有一个包含相同的值,我们可以使用除法并存储余数。我不会给你确切的代码,但我会给你一个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.
如果计划得当,这也是递归的一个很好的例子。这将允许您在现有数组中运行循环以匹配数据。
公共字符串calcFunction(denomValue,amount)
最终,你会得到2200、1100、150、125、45个硬币、10.5美分,如果它们存在的话,你会得到30.1美分,但我在你的列表中看不到这一点。你把数组弄糊涂了。这主要是一个分析测试 你有三种面额,它们是“纸币”、“硬币”、“美分” 由于它们中没有一个包含相同的值,我们可以使用除法并存储余数。我不会给你确切的代码,但我会给你一个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.
如果计划得当,这也是递归的一个很好的例子。这将允许您在现有数组中运行循环以匹配数据。
公共字符串calcFunction(denomValue,amount)
最终,你会得到2200、1100、150、125、45个硬币、10.5美分,如果它们存在的话,你会得到30.1美分,但我在你的列表中看不到这一点。这比最初看起来更难。我有一个办法: 从最小的分开始,用它们计算返回值: 在您的示例中:
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)
这比最初看起来更难。我有一个办法: 从最小的分开始,用它们计算返回值: 在您的示例中:
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)
我想您应该使用
购买
并将其除以值的每个元素
,然后使用floor
函数截断余数;然后使用余数并将其除以下一个值(如果需要,您可以循环使用)。最后,您将拥有构成购买的最小纸币/硬币数量。请键入“硬币兑换”或“硬币兑换”在搜索框中,你会发现几十个关于这个问题的问题。它甚至有自己的标签硬币兑换
。我想你应该使用你的购买
,将其除以值的每个元素
,并使用floor
函数截断余数;使用余数并将其除以下一个值(如果您愿意,您可以循环使用此选项)。最后,您将拥有构成购买的最小纸币/硬币数量。键入“硬币兑换”或“兑换赠予”在搜索框中,你会发现几十个关于这个问题的问题。它甚至有自己的标签硬币兑换
。只要从最大值而不是最小值开始,整个问题就会变得非常简单。我的答案必须是1*200,1*50,2*20只要从最大值而不是最小值开始,整个问题就是b我的答案必须是1*200,1*50,2*20,我知道你的意思,但是如果我输入290,我会得到1*200,1*50,1*25,3*5,这是不正确的,因为我可以得到1*200,1*50,2*20,这更优化了你的意思,但是如果我输入290,我会得到1*200,1*50,1*25,3*5,这是不正确的,因为我可以得到1*200,1*50,2*20,这是更优化的D