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 };