問題:假設有一台機器,以及在此機器上處理的n個作業a1,a2,...an的集合。每隔作業aj有乙個處理時間tj,效益pj,以及最後期限dj。機器在乙個時刻只能處理乙個作業,而且作業aj必須在tj連續時間單位內不間斷地執行。如果作業aj在最後期限dj之前完成,則獲得效益pj,但如果在最後期限之後才完成,則沒有效益。請給出乙個動態規劃演算法,來尋找能獲得最大量效益的排程,假設所有的處理時間都是1到n之間的整數。
分析:其實這個問題類似於01揹包問題。
1. 將a1,a2,…,an按照dj值排序,從小到大。假設接下來的分析中,已經保證當i
2. 構建陣列s[n][d[n]],s[i][j]代表在j時間內,排程i個作業,所得最高效益值。初始時,令s[i][0] = 0(i = 0->n),s[0][j] = 0(j = 0->d[n])。
3. 求s[i][j]的值,select[i][j]用於記錄是否選擇i。這裡遞迴包含了一種思想:如果第i個作業被排程,那麼最好使其在期限時正好結束,這樣能夠保證i之前的作業能夠在更充裕的時間內被排程。
for i = 1->n
for j = 1->d[i]
//不排程i
s[i][j] = s[i-1][min(j, d[i-1])]
select[i][j] = false
//排程i
if j>t[i]
if s[i][j] < s[i-1][min(j-t[i], d[i-1])]+p[i]
s[i][j] = s[i-1][min(j-t[i], d[i-1])]+p[i]
select[i][j] = true
我之前任務這就是乙個單純的揹包問題,不理解上面為什麼要排序,為什麼要求min
下面的段錯誤的**:
int maxv = 0x80000000;
int f[n] = ;
for (int i = 0; i < n; ++i )
} cout<
這是因為任務有截止期限的,所以必須按照di從小到大排序
下面的**比較好理解
sort();
int end = deadline[0] - time[0];
for (int i = 0; i < end; ++i)
f[0][i] = 0;
for (int i = end; i<= deadline[0]; ++i)
f[0][i] = value[i];
for (int i = 1; i < n; ++i)
else
}}
動態規劃 達到最高效益的排程
問題 假設有一台機器,以及在此機器上處理的n個作業a1,a2,an的集合。每隔作業aj有乙個處理時間tj,效益pj,以及最後期限dj。機器在乙個時刻只能處理乙個作業,而且作業aj必須在tj連續時間單位內不間斷地執行。如果作業aj在最後期限dj之前完成,則獲得效益pj,但如果在最後期限之後才完成,則沒...
動態規劃 達到最高效益的排程
問題 假設有一台機器,以及在此機器上處理的n個作業a1,a2,an的集合。每隔作業aj有乙個處理時間tj,效益pj,以及最後期限dj。機器在乙個時刻只能處理乙個作業,而且作業aj必須在tj連續時間單位內不間斷地執行。如果作業aj在最後期限dj之前完成,則獲得效益pj,但如果在最後期限之後才完成,則沒...
雲計算中想實現最高效益比要看這5點
但是雲 混合模型的最大好處是,與傳統解決方案相比,它可以是成本的一半或更低,並且可以微調其實踐,以更好地在日益擁擠的市場中競爭。但是,雲容科技會提示您在雲中實現最高的成本 收益比,企業必須關注多種因素 雲計算中想實現最高效益比要看這5點 1 軟體許可和支援 大多數協議都是漫長而複雜的,規則通常會對遷...