雙核處理(動態規劃的01揹包問題)
題目
一種雙核CPU的兩個核能夠同時的處理任務,現在有n個已知資料量的任務需要交給CPU處理,假設已知CPU的每個核1秒可以處理1kb,每個核同時只能處理一項任務。n個任務可以按照任意順序放入CPU進行處理,現在需要設計一個方案讓CPU處理完這批任務所需的時間最少,求這個最小的時間
輸入描述:
輸入包括兩行: 第一行為整數n(1 ≤ n ≤ 50) 第二行為n個整數length[i](1024 ≤ length[i] ≤
4194304),表示每個任務的長度為length[i]kb,每個數均為1024的倍數。
輸出描述:
輸出一個整數,表示最少需要處理的時間
輸入例子:
5 3072 3072 7168 3072 1024
輸出例子:
9216
分析:
1、要讓雙核CPU執行的時間最少,其實就是要讓兩個核儘量同時結束。也就是要讓一個核所執行的時間儘量逼近執行總時間的一半,也就是sum/2。
2、這樣其實就將題目轉化成了一個01揹包問題。筆者對於01揹包問題之前都是通過“深度優先搜尋+回溯”的方式解決,但是在使用的時候往往會讓複雜度過高或者執行時間過長,此例使用的是動態規劃方式。
3、題目中其實有提示使用動態規劃的01揹包方式,題目中強調了“每個數均為1024的倍數”。
思路:
1、由於需要用總時間來建立陣列,因此接收到資料後統一除以1024後儲存。(最後輸出的時候乘以1024)
2、i代表揹包中處理了i個任務(可能裝入可能不裝入),j代表目前揹包中有j的空間可以存放。
3、如果放入任務時間超過j,也就是p[i]>j,那麼揹包中就無法再放入任務,所以dp[i + 1][j] = dp[i][j]。反之,有兩種可能,可能放入也可能不放入,這取決於此時放入的物品的價效比有沒有之前放入的物品的價效比高,如果放入那麼就為dp[i + 1][j] = dp[i][j - p[i]] + p[i],如果不放入就為dp[i + 1][j] =dp[i][j]。
4、最後附上這道題的陣列例項:
0 0 0 0 0 0 0 0 0
0 0 0 3 3 3 3 3 3
0 0 0 3 3 3 6 6 6
0 0 0 3 3 3 6 7 7
0 0 0 3 3 3 6 7 7
0 1 1 3 4 4 6 7 8
程式碼:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] p = new int[n];
int sum = 0;
for (int i = 0; i < n; i++) {
p[i] = scan.nextInt() / 1024;
sum += p[i];
}
int[][] dp = new int[n + 1][sum / 2 + 1];
for (int i = 0; i < n; i++)
for (int j = 1; j <=sum / 2; j++) {
if (j < p[i])
dp[i + 1][j] = dp[i][j];
else
dp[i + 1][j] = Math.max(dp[i][j], dp[i][j - p[i]] + p[i]);
}
System.out.println((sum - dp[n][sum / 2]) * 1024);
}
}
相關文章
- 動態規劃 01揹包問題動態規劃
- 【動態規劃】01揹包問題動態規劃
- 動態規劃-01揹包問題動態規劃
- 【動態規劃】01揹包問題【續】動態規劃
- 揹包問題----動態規劃動態規劃
- 【動態規劃】揹包問題動態規劃
- 動態規劃篇——揹包問題動態規劃
- 動態規劃系列之六01揹包問題動態規劃
- 01揹包問題理解動態規劃演算法動態規劃演算法
- 0-1揹包問題(動態規劃)動態規劃
- 詳解動態規劃01揹包問題--JavaScript實現動態規劃JavaScript
- 詳解動態規劃01揹包問題–JavaScript實現動態規劃JavaScript
- 動態規劃之0,1揹包問題動態規劃
- 動態規劃解0-1揹包問題動態規劃
- 0-1揹包問題 動態規劃法動態規劃
- 動態規劃之01揹包問題(最易理解的講解)動態規劃
- 動態規劃-揹包類動態規劃
- 【動態規劃】一次搞定三種揹包問題動態規劃
- 動態規劃之 0-1 揹包問題詳解動態規劃
- 01揹包動態規劃空間優化動態規劃優化
- 【動態規劃】0-1揹包問題原理和實現動態規劃
- 動態規劃0-1揹包動態規劃
- python 動態規劃(揹包問題和最長公共子串)Python動態規劃
- 前端與演算法-動態規劃之01揹包問題淺析與實現前端演算法動態規劃
- 【LeetCode動態規劃#10】完全揹包問題實戰,其三(單詞拆分,涉及集合處理字串)LeetCode動態規劃字串
- 洛谷 1064——金明的預算方案(動態規劃的揹包問題)動態規劃
- 多重揹包動態規劃及空間優化動態規劃優化
- 【LeetCode動態規劃#06】分割等和子集(01揹包問題一維寫法實戰)LeetCode動態規劃
- 揹包問題演算法全解析:動態規劃和貪心演算法詳解演算法動態規劃
- 【演算法資料結構Java實現】Java實現動態規劃(揹包問題)演算法資料結構Java動態規劃
- 【LeetCode動態規劃#05】揹包問題的理論分析(基於程式碼隨想錄的個人理解,多圖)LeetCode動態規劃
- 【LeetCode動態規劃#08】完全揹包問題實戰與分析(零錢兌換II)LeetCode動態規劃
- 01揹包問題的解決
- DP 動態規劃 Problem V 1022 反向考慮的揹包動態規劃
- 從【零錢兌換】問題看01揹包和完全揹包問題
- 動態規劃之子序列問題動態規劃
- 整數劃分問題(動態規劃)動態規劃
- 【LeetCode動態規劃#07】01揹包問題一維寫法(狀態壓縮)實戰,其二(目標和、零一和)LeetCode動態規劃