項目安排(動態規劃)

項目描述:
小明天天都在開源社區上作項目,假設天天他都有不少項目能夠選,其中每一個項目都有一個開始時間和截止時間,假設作完每一個項目後,拿到報酬都是不一樣的。因爲小明立刻就要碩士畢業了,面臨着買房、買車、給女朋友買各類包包的鴨梨,可是他的錢包卻空空如也,他須要足夠的money來充實錢包。萬能的網友麻煩你來幫幫小明,如何在最短期內安排本身手中的項目才能保證賺錢最多(注意:作項目的時候,項目不能並行,即兩個項目之間不能有時間重疊,可是一個項目剛結束,就能夠當即作另外一個項目,即項目起止時間點能夠重疊)。
輸入:

輸入可能包含多個測試樣例。
對於每一個測試案例,輸入的第一行是一個整數n(1<=n<=10000):表明小明手中的項目個數。
接下來共有n行,每行有3個整數st、ed、val,分別表示項目的開始、截至時間和項目的報酬,相鄰兩數之間用空格隔開。
st、ed、value取值均在32位有符號整數(int)的範圍內,輸入數據保證全部數據的value總和也在int範圍內 測試

輸出:

對應每一個測試案例,輸出小明能夠得到的最大報酬。spa

樣例輸入:
3
1 3 6
4 8 9
2 5 16
4
1 14 10
5 20 15
15 20 8
18 22 12
樣例輸出:
16
22

解題思路:code

動態規劃題blog

能夠按照01揹包思路解決。不一樣之處在於:01揹包中是順序無關的排序

這裏按結束的時間先排序。(也能夠按開始時間排序,遍歷的次序須要顛倒一下)it

參考代碼:
 1 #include <stdio.h>
 2 #include <algorithm>
 3 using namespace std;
 4 int n;
 5 class P
 6 {
 7  public:
 8  int start,end,value;
 9 };
10 P p[10001];
11 int dp[10001]; //dp[i]安排前i個項目,最多能到獲得的最大value
12 bool cmp(const P & p1, const P & p2){
13     return p1.end < p2.end;
14 }
15 
16 int main()
17 {
18   int n, i, j;
19   while(scanf("%d", &n) != EOF){
20   for(i=1; i<=n; i++)
21   {scanf("%d %d %d", &p[i].start, &p[i].end, &p[i].value);
22     dp[i] = 0;
23     }
24     sort(p+1, p+n+1, cmp); //按結束時間排序是重點
25     dp[0] = 0;
26     for(i=1; i<=n; i++)
27         {
28        for(j=i-1; j>0; j--)//查找最的j,可知足當前的i。都不知足就j=0
29        {if(p[i].start >= p[j].end)    break;}
30       dp[i] = dp[j] + p[i].value;
31       if(dp[i] < dp[i-1])
32       dp[i] = dp[i-1];
33         }
34         printf("%d\n",dp[n]);
35     }
36     return 0;
37 }
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息