Algorithm 购买时给予的最小现金数

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

我最近遇到一个问题如下:-

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

注释可以是25,50100200 硬币可以是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
函数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