各位大大,来帮我一把,我实在做不出来,你们来看看吧(50分)

  • 主题发起人 主题发起人 Akeyfly
  • 开始时间 开始时间
A

Akeyfly

Unregistered / Unconfirmed
GUEST, unregistred user!
假设五个人工资1053,2014,3038,9154,6814
人民币面值100,50,20,10,1
问取多少张100的多少张50的。。。多少张1元的使每个人都能顺利领到钱不要找零,且取钱的总张数最少。
要求:一次连续输入5个人的工资后,显示五个人100元一共领了多少张,50元一共领了多少张...一元一共领了多少张,最后再算出100元50元。。1元加起来一共领了多少张?


昨天我实现了输一个算一个,可是现在怎么改才能符合要求呢?
程序如下:

var a,b,c,d,e,f,g,h,i:integer;
count:array[0..4]of integer;

begin
for i:=0 to 4 do
begin
count:=strtoint(inputbox('工资金额','请输入要计算的工资金额','0'));
if count=0 then exit;
a:=count div 100;
b:=count mod 100;
c:=b div 50;
d:=b mod 50;
e:=d div 20;
f:=d mod 20;
g:=f div 10;
h:=f mod 10;
showmessage('100元'+inttostr(a)+'张'+'50元'+inttostr(c)+'张'+'20元'+inttostr(e)+'张'+'10元'+inttostr(g)+'张'+'1元'+inttostr(h)+'张');
end;
end;
end.
 
使用贪心算法
 
还有什么不符合你的要求 ?[?]
 
回楼上的:
现在只是一个人一个人算出来各个币种,可是我想一次连续输入5个人的工资后,显示五个人100元一共领了多少张,50元一共领了多少张...一元一共领了多少张,最后再算出100元50元。。1元加起来一共领了多少张?
 
晕死,这个完全就是图论里面的一个背包问题,找本图论,或者在google上搜索看看,肯定好多的。举个例子说一下:比如一个箱子可以装77kg,那么现在有10kg,5kg,1kg的东西,那么怎么装能够装下足够多的东西呢?这就是凑一个数,然后这个数最接近77这个数,但是不能超过哦,毕竟只能装77。这个例子和你说的一样的道理,不是什么贪心问题了!
 
你一个人的算出来了,那五个人的算法不是一样嘛
比如你设计五个edit.text,只输入数字,就是你说的工资
用你的算法,分别计算每个edit.text的张数什么的,并且存储起来
五个算出来的时候,把结果输出来,不就可以实现了嘛
 
回楼上的,如果我要是100个人,那我就要设计100个edit.txt了,呵呵,不好办,不过谢谢您。
 
楼主把所有的员工的工资存到数据库, 然后sum(工资)求得总额.
再按你上面的算法计算不就可以了.
 
哪位大侠帮我写出来给小弟看看,小弟我第一次学习delphi,什么都还不熟悉,拜求各位过路大侠帮小弟一码,多谢。
 
为什么要设计100个Edit.txt呢?不可能同一时间同时录入100人吧?!肯定一个人一个人工资录入呀,录完一个人后就象你计算一样,保存所用的:100、50、20、10、5、1,录完N个之后,再统计出所用的:100,50,20,10,5,1,我就是这样做的,当初帮一个单位设计时,有近1000号人,程序用了几年,现在呀,工资打入卡中,这个功能就不用啦
 
cqwty 说的不错,找运筹学树学习下 . 呵呵这个是运筹学的知识在里面有讲这个算法的.用计算机实现你先得知道数学方法.这个算法比较复杂,计算很简单,有类是整数规划算法,在学校学的现在都忘了,信息管理与信息系统的一个研究生考试题和这个意思一样.
 
超晕,这个问题跟图论有什么关系啊。。。。,不就是将每个人的钱进行分解,然后对不同面额的人民币进行累加, 超简单啊。
 
。。。。。。。。。。。。。各位富翁不要将简单的问题复杂化了,书读死了不好
 
lxggc,要不要再给你来一个超简单的啊?这个不是问题复杂化,说是那么说,关键是如何找到一个行之有效的方法来解决问题,你不就是把题目的意思分解出来吗?但是这个不是解决问题的办法撒!
 
lxggc说的对,只要学过数学就能做出来,什么图,什么运筹,哪有那么难的。本来,Akeyfly自己已经做出来了,再把所用的人所用的100,50....累加不就完了吗。
 
var
a100, a50, a20, a10,,a1:integer;


procedure DoOne(x:integer);
begin
a100 := a100 + x div 100; x := x - (x div 100) * 100;
a50 := a50 + x div 50 ; x := x - (x div 50) * 50;
a20 := a20 + x div 20 ; x := x - (x div 20) * 20;
a10 := a10 + x div 10 ; x := x - (x div 10) * 10;
a1 := a1 + x;
end;

procedure DoWork;
begin
a100 :=0; a50:=0; a20:=0; a10:=0; a1:=0;
DoOne(789);
DoOne(12389);
DoOne(123);
DoOne(234);
DoOne(123234);
ShowMessage(Format('100:%d, 50:%d, 20:%d, 10:%d, 1:%d',
[a100,a50,a20,a10,a1]
);
end;
 
请大家说说我的算法有没有问题, 跟图论什么的有没有关系?
 
呵呵, x:= x - (x div 100) * 100; 应该改成 x := x mod 100;
 
晕倒,这年头,数学家居多。
 
呵呵背包 问题 就这样简单呵呵,呵呵 最优解是最麻烦的,不是说算出来就可以.5人是相互约束的.呵呵这个问题是简单了点 100 张数 50 元张数 1元张数 没有限制 不然你哪个算法.呵呵
 
后退
顶部