一个难倒了数个程序员的问题,请大家指教

peihexian 2004-01-26 08:58:27
问题:
有一家加工电缆的工厂,原材料有100多类,每一类的原材料分别包括不同的长度,如1类原材料包括6米

,7米,8米三种长度,2类原材料包括9米,10米两种,这家工厂要加工的产品长度每次都不固定,一次加工

最少生产100根以上的目标产品,目标产品的长度不固定,如1.2米,1.32米,0.25米等,现求一算法,要求

根据要准备生产的目标产品计算需要使用多少原材料?


需要注意的地方:
1.有时100根目标产品的长度每一根都不一样
2.这100根产品当然不是1根2根的原材料就能生产出来的,在使用多根原材料时,就不可避免的会出现一根

原材料不能完完全全的使用掉的情况,要求一种算法为最小浪费原材料,另一种是最少使用原材料。

再举一个小例子:

目标产品长度分别为 2米,1.2米,1.6米,1.2米 ,现有原材料分别为4米和6.1米两种,如果按照最小浪费原

材料的算法,4米的原材料可以分为1.2,1.6,1.2,然后用6.1米的去生产2米的;如果按照最少使用原材料的

算法,原就直接用6.1米的去生产就可以了。


我想到的笨思路是把所有可能的分解情况组合出来,然后判断哪一种组合最小浪费原材料,按照我的算法

,所有可能的组合是:

2
2 1.2
2 1.2 1.6
2 1.2 1.6 1.2
2 1.2 1.2
2 1.6
2 1.6 1.2
2 1.2
1.2
1.2 1.6
1.2 1.6 1.2
1.2 1.2
1.6
1.6 1.2
1.2

生成以上结果的delphi程序:
procedure TForm1.Button2Click(Sender: TObject);
procedure Test2(const Index: Integer;const ParentStr:string);
var
I : Integer;
Str: string;
begin
Str := '';
for I := Index to BList.Count-1 do
begin
Str :=ParentStr+BList.Strings[I];
Memo1.Lines.Add(str);
Test2(I+1,str);
end;
end;
var
I:Integer;
begin
Memo1.Lines.Clear;
BList.Add('2');
BList.Add('1.2');
BList.Add('1.6');
BList.Add('1.2');
Test2(0,'');
end;

显然,这种算法的时间复杂度是2^N次方,如果要生产100根目标产品,则计算机要运算2的100次方次,也

就是1267650600228229401496703205376 次才能出来一次组合的最优解,然后去掉拆分完的产品,再次进

行组合,第二次组合也不太节省时间,如2的90次方或2的80次方才能出来第二次的最优解,
显然这个算法是不行的,这个问题用动态规划来解决也不符合条件,因为一个最优解是需要几个目标产品

组合在一起再去和原材料比较才能出结果的。

有人说要用背包算法,仔细推敲,这个问题与背包算法也不符合。
我实在想不出来好的解决方法了,请大家指教。


最好给出具体的程序,谢谢!


...全文
44 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tmxsl1214 2004-02-02
  • 打赏
  • 举报
回复
学习!
peihexian 2004-01-27
  • 打赏
  • 举报
回复
up一下,请大家指教。
jettylee 2004-01-26
  • 打赏
  • 举报
回复
记得好象有人贴过这个问题的
gnefuil 2004-01-26
  • 打赏
  • 举报
回复
应该是NPC问题,想破脑袋也白搭,除非理论上能够证明P=NP
可以考虑找较优的解而不是最优解,这题说白了是个组和优化的问题,可以用GA试试

peihexian 2004-01-26
  • 打赏
  • 举报
回复
这个该死的问题浪费了我春节放假的大部分时间,无论如何我也要解决掉它。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧