一个难倒了数个程序员的问题,请大家指教
问题:
有一家加工电缆的工厂,原材料有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次方才能出来第二次的最优解,
显然这个算法是不行的,这个问题用动态规划来解决也不符合条件,因为一个最优解是需要几个目标产品
组合在一起再去和原材料比较才能出结果的。
有人说要用背包算法,仔细推敲,这个问题与背包算法也不符合。
我实在想不出来好的解决方法了,请大家指教。
最好给出具体的程序,谢谢!