得到有一堆的数字.用一个算法将这些数字组合起来(就是加起来)成最接近一个数(比如1000),求最优的一个组合.
比如有300\200\150\250\350四个数字,要组合成最接近500的数就是,300+200;150+350(越接近的越优先),250.这个算法我研究了很长时间,一直没有好的办法(我对算法很菜的).可能要经过多次循环扫描.那样代码可能会很长,效率又低.大家如果有好的主意还希望指教.谢谢了.
比如有300\200\150\250\350四个数字,要组合成最接近500的数就是,300+200;150+350(越接近的越优先),250.这个算法我研究了很长时间,一直没有好的办法(我对算法很菜的).可能要经过多次循环扫描.那样代码可能会很长,效率又低.大家如果有好的主意还希望指教.谢谢了.
解决方案 »
- 【求助】各路大侠进来一下,有人知道这是怎么回事么?
- 寻找无锡程序员
- 如何将一张2d的头像图片转换为3d头像图片?高分求解!
- ※※一个关于关闭其它电脑应用程序 和 远程关机 的问题※※
- 请教各位高手!如何判断一个文件是否已被应用程序打开???
- 如何在字串资源里存放变量?
- 求用winsock下载exe文件源代码……
- 谁能给我一个可用的windows2000server的注册号,不胜感谢!
- 菜鸟问菜鸟问题:mp3ocx怎么注册?我已有了注册码
- who have threed20.ocx,help me?
- 关于改变外部程序TFlatCheckBox类控件选择状态的问题(高分)
- 如何在一个位图的指定区域实现红绿灯功能?
数组为a1=300,a2=200,a3=150,a4=250,a5=350
temp=s-a1
找余下的数中与temp最接近的
然后temp=s-a2
........
继续
先对a数组进行从大到小排序,f置空。
for i:=1 to maxa do begin
if a[i]<= n then f[i].data:=a[i] else f[i].data:=0;
maxf:=f[i].data;
for j:=1 to i-1 do
if (f[j].data+a[i]<=n)and(f[j].data+a[i]>maxf) then begin
maxf:=f[j].data+a[i];
maxid:=j;
end;
f[i].data:=maxf;
f[i].pre:=maxid;
end;
似乎这样之后,对f进行一下遍历就可以找出最大的了。
没论证过无后效性,可能代码完全错误。