直接放圖吧:
這是我第一次寫的**:
#include
using
namespace std;
int n, m, mac[
10001
], time[
10001
], ans = int_max /
3, min = int_max /
3, now =0;
intsetnow()
void
dfs(
int d)
for(
int i =
1; i <= m; i++)}
bool
compare
(int a,
int b)
intmain()
洞可能有些多,一步步慢慢來:
這一段→→→
int
setnow()
能否優化?
因為我們發現,當時更新的只是mac[i]
,所以只要比較mac[i]
即可。
#include
using
namespace std;
int n, m, mac[
10001
], time[
10001
], ans = int_max /
3, min = int_max /
3, now =0;
void
dfs(
int d)
for(
int i =
1; i <= m; i++)}
bool
compare
(int a,
int b)
intmain()
繼續看:
now =
max(now, time[d]);
if(now >= ans)
return
;dfs
(d +1)
; mac[i]
-= time[d]
; now =
min(now, time[d]
);
now
實質上是不可逆的,例如:
mac[1]
mac[2]
nowtime[i]102
1020
經過:
now =
max(now, time[d]
);
更新:
mac[1]
mac[2]
nowtime[i]
1022
2220
再經過:
now =
min(now, time[d]
);
卻變成了
mac[1]
mac[2]
nowtime[i]102
220所以我們要乙個臨時變數儲存。
if
(now >= ans)
return
;
難道放在mac[i]
不成立,後面的機器都被拋棄了嗎?
剪枝:
for
(int i =
1; i <= m; i++
) min =
max(min, mac[i]
);
#include
using
namespace std;
int n, m, mac[
10001
], time[
10001
], ans = int_max /3;
void
dfs(
int d,
int now)
int new;
for(
int i =
1; i <= m; i++
)dfs
(d +
1, new)
; mac[i]
-= time[d];}
}bool
compare
(int a,
int b)
intmain()
ac。 最佳排程問題
假設有n n 20 個任務由k k 20 個可並行工作的機器完成。完成任務i需要的時間為ti。試設計乙個演算法,對任意給定的整數n和k,以及完成任務i 需要的時間為ti i 1 n。計算完成這n個任務的最佳排程,使得完成全部任務的時間最早。輸入格式 輸入資料的第一行有2 個正整數n和k。第2 行的n...
最佳排程問題
假設有n個任務由k個可並行工作的機器完成,完成任務i需要的時間為ti,對任意給定的整數n和k,以及完成任務i需要的時間ti,設計乙個演算法,求完成這n個任務的最佳排程,使得完成全部任務的時間最早。第一行有2個正整數n和k,第二行有n個正整數,表示ti n 7000,c樣例輸入7 3 2 14 4 1...
PTA 最佳排程問題
假設有n n 20 個任務由k k 20 個可並行工作的機器完成。完成任務i需要的時間為ti。試設計乙個演算法,對任意給定的整數n和k,以及完成任務i 需要的時間為ti i 1 n。計算完成這n個任務的最佳排程,使得完成全部任務的時間最早。輸入格式 輸入資料的第一行有2 個正整數n和k。第2 行的n...