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<0x3f3f3f3f); 8 dp[0]=0; 9 vector<bool> valid(1< false); 10 for (int i = 0; i < 1< ) 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< ) 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< 1]; 36 } 37 };