标签:
题目抽象:有n个任务需要完成。 每个任务需要完成的时间为ti,权为si. 完成某项任务的价值为:开工时剩下的时间与该任务的权之积。如果剩下的时间小于完成该任务需要的时间,该任务无法完成,也就不能产生价值。求在剩下的时间内,能获得的最大价值。
分析:对于最优序列。 我们任取两个人物分析。不管这两个任务顺序怎么样,完成的时间一定,对后面的影响是一样的。我们比较两个任务不同顺序产生的价值。
得知,按si/ ti > sj/tj 顺序。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <vector> 7 #include <string> 8 #include <map> 9 #include <set> 10 #include <queue> 11 #include <stack> 12 #include <sstream> 13 using namespace std; 14 typedef long long LL; 15 const int INF = 0x4fffffff; 16 const double EXP=1E-5; 17 const int MS = 10005; 18 19 struct node 20 { 21 int time,size; 22 bool operator < (const node & a )const 23 { 24 return size * a.time > time * a.size; 25 } 26 }nodes[MS]; 27 28 int dp[MS]; 29 30 int main() 31 { 32 int N,T; 33 while(scanf("%d%d",&N,&T)!=EOF) 34 { 35 for(int i = 0; i < N; i++) 36 scanf("%d%d",&nodes[i].time,&nodes[i].size); 37 sort(nodes,nodes+N); 38 memset(dp,0,sizeof(dp)); 39 int ans = 0; 40 41 for(int i = N-1;i>=0;i--) 42 { 43 for(int t = T;t >= nodes[i].time;t--) 44 { 45 dp[t] = max(dp[t] , dp[t-nodes[i].time] +t * nodes[i].size ); 46 } 47 } 48 printf("%d\n",dp[T]); 49 } 50 return 0; 51 }
标签:
原文地址:http://www.cnblogs.com/hutaishi/p/4665728.html