某汽⻋公司在有多條裝配線的⼯⼚內⽣產汽⻋,⼀個汽⻋底盤在進⼊每⼀條裝配線後,在每個⼯作站會在汽⻋底盤上安裝不同的部件,最後完成的汽⻋從裝配線的末端離開。 每⼀條裝配線上都有 n 個⼯作站,裝配線i的第 j 個⼯作站 用s(i,j)表示, 在兩條裝配線相同位置的⼯作站執⾏相同的功能,但由於⼯作站是在不同的時間建造的,並且採⽤了不同的技術,因此,每個⼯作站上完成裝配所需要的時間也不相同。 正常情況下,底盤從同⼀條裝配線的上⼀個⼯作站移到下⼀個⼯作站所花費的時間可以忽略,但是遇到緊急訂單時也會將未完成的底盤從⼀條裝配線的⼀個⼯作站移到另⼀條裝配線的下⼀個⼯作站,但從某裝配線移⾛到另乙個裝配線的下一工作站也需要花費一定時間,此外,底盤進⼊裝配線 i 需要的時間為 e(i),離開裝配線 i 需要的時間是 x(i)。 請選擇在哪些裝配線內的⼯作站進行裝配,以使汽⻋通過⼯⼚的總時間最⼩。 如下圖所示, 最快的時間是選擇裝配線1的 1、3和 6 號⼯作站以及裝配線 2 的 2、4 和 5 號⼯作站,最短的通過時間為38。
輸入格式:
第一行是裝配線數量lines和工作站數量stations,用空格符間隔。
接下來lines行是每個裝配線上工作站的裝配時間。
接下來lines行是從當前裝配線移到其它裝配線下乙個工作站的移動時間。注意最後乙個工作站沒有移動時間。
接下來一行是進入各條裝配線的時間e[i]。
接下一行是退出各裝配線的時間x[i]。
輸出格式:
第一行輸出總的裝配時間。
接下來按照順序輸出裝配過程,格式如下:
裝配線 工作站
輸入樣例:
在這裡給出一組輸入。例如:
2 67 9 3 4 8 4
8 5 6 4 5 7
2 3 1 3 4
2 1 2 2 1
2 43 2
輸出樣例:
在這裡給出相應的輸出。例如:
total time 38
1 12 2
1 32 4
2 51 6
#include
#include
using
namespace std;
int lines, stations;
int sta[
105]
[1005];
//存放工作站
int lin[
105]
[1005];
//存放分配線
int f[
105]
[1005];
int ans[
1005];
//存放通過最短時間走過的站點
intmain()
for(
int i =
1; i <= lines; i++
) cin >> lin[i]
[stations]
;memset
(f,10000
,sizeof
(f))
;//用dp的思想求f陣列
for(
int i =
1; i <= lines; i++
)//遍歷每個工作站
f[i][1
]= lin[i][0
]+ sta[i][1
];for(
int i =
2; i <= stations; i++)}
}/*for (int i = 1; i <= lines; i++) */
int flength =
99999
;//通過f陣列的最後一列來求最短通過時間
for(
int i =
1; i <= lines; i++)if
(flength >
(f[i]
[stations]
+lin[i]
[stations]))
flength = f[i]
[stations]
+ lin[i]
[stations]
; cout <<
"total time "
<< flength << endl;
//f陣列從後往前找路徑,逐一減去權值和站點的值來和f陣列作比較得出是否為最優路徑
//找出最後乙個站點
for(
int i =
1; i <= lines; i++)if
((flength - lin[i]
[stations]
)== f[i]
[stations]
)for
(int i = stations; i >=
1; i--
)for
(int k =
1; k <= lines; k++)if
(k != j)}}
if(flag)
break;}
}for
(int i =
1; i <= stations; i++
) cout << ans[i]
<<
" "<< i << endl;
system
("pause");
return0;
}
裝配線(工作站)問題的兩種解法
上學的時候有一道題目一直困擾著我,那就是廚師擺盤子問題,問題的描述是這樣的 廚師的所有盤子都放在乙個架子上,每天工作結束他都要將盤子按照從小到大的順序排好,問題是架子不太穩,如果一次拿出乙個或幾個盤子,架子可能要倒掉,所以他必須只能從一邊翻動盤子,由於他只有兩隻手,所以只能用兩隻手將拿起的盤子一起翻...
裝配線(工作站)問題的兩種解法
上學的時候有一道題目一直困擾著我,那就是廚師擺盤子問題,問題的描述是這樣的 廚師的所有盤子都放在乙個架子上,每天工作結束他都要將盤子按照從小到大的順序排好,問題是架子不太穩,如果一次拿出乙個或幾個盤子,架子可能要倒掉,所以他必須只能從一邊翻動盤子,由於他只有兩隻手,所以只能用兩隻手將拿起的盤子一起翻...
裝配線(工作站)問題的兩種解法
上學的時候有一道題目一直困擾著我,那就是廚師擺盤子問題,問題的描述是這樣的 廚師的所有盤子都放在乙個架子上,每天工作結束他都要將盤子按照從小到大的順序排好,問題是架子不太穩,如果一次拿出乙個或幾個盤子,架子可能要倒掉,所以他必須只能從一邊翻動盤子,由於他只有兩隻手,所以只能用兩隻手將拿起的盤子一起翻...