1. 程式人生 > 其它 >leetcode1986 完成任務的最少工作時間段

leetcode1986 完成任務的最少工作時間段

思路:

列舉子集的動態規劃。

實現:

 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 } 19
if (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 };