leetcode1986 完成任務的最少工作時間段
阿新 • • 發佈:2022-03-21
思路:
列舉子集的動態規劃。
實現:
1 class Solution 2 { 3 public: 4 int minSessions(vector<int>& tasks, int sessionTime) 5 { 6 int n = tasks.size(); 7 vector<int> dp(1<<n, 0x3f3f3f3f); 8 dp[0]=0; 9 vector<bool> valid(1<<n, false); 10 for(int i = 0; i < 1<<n; i++) 11 { 12 unsigned int msk=1; 13 int sum = 0; 14 for (int j = 0; j < 32; j++) 15 { 16 unsigned int tmp = msk << j; 17 if (tmp & i) sum += tasks[j]; 18 } 19if (sum <= sessionTime) 20 { 21 valid[i]=true; 22 } 23 } 24 25 for (int i = 1; i < 1<<n; i++) 26 { 27 int msk = i, subset = i; 28 while (subset != 0) 29 { 30 subset = (subset-1) & msk; 31 int rem = i-subset; 32 if (valid[rem]) dp[i] = min(dp[i], dp[subset] + 1); 33 } 34 } 35 return dp[(1<<n)-1]; 36 } 37 };