- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
Tony老师是一个自由职业者。他手中有一份接下来15天的每日工作安排,他要选择一些日子来工作。
每天的工作会带来一定的收入w_i,但会消耗一定的精神值s_i。
Tony老师最初一共有S点精神值;如果进行到某天,他的剩余精神值不足以完成当天的任务,那么他就不会开始这项任务。
另外,Tony老师有严重的拖延症,他在最后5天的工作天数一定要比前10天的加起来多(或者相等)。请你帮Tony老师计算一下,他这三个礼拜最多可以赚到多少钱? - 输入
- 第一行是一个正整数S,表示Tony老师一开始的精神值。(保证所有精神值加起来不超过int的范围)
随后是15行,每行2个整数,分别表示当天工作的收入wi和要消耗的精神值si。 - 输出
- 一个整数,Tony老师最多可以赚到的钱数。
- 样例输入
-
120 3 2 3 2 3 2 8 2 3 2 5 4 5 4 5 4 5 4 5 4 10 5 10 5 10 5 10 5 10 5
- 样例输出
-
78
- 提示
- 样例解释:
最后5天每天都工作。
前10天中,第四天(8 2)工作,然后再在6-10天中(5 4)选择4天工作即可。
1 #include<iostream> 2 #include<queue> 3 #include<cstring> 4 using namespace std; 5 int w[18]; 6 int s[18]; 7 bool work[18]; 8 int ss; 9 int maxsum = -1; 10 void dfs(int x, int left){ //考虑第x天是否干活,剩下多少精力 11 if(x==16){ 12 int first10 = 0, last5 = 0, sum = 0; 13 for(int i = 1; i <= 10; i++) 14 if(work[i]){ 15 first10++; 16 sum+=w[i]; 17 } 18 for(int i = 11; i <= 15; i++){ 19 if(work[i]){ 20 last5++; 21 sum+=w[i]; 22 } 23 } 24 if(last5>=first10){ 25 maxsum = max(maxsum, sum); 26 } 27 return; 28 } 29 if(left>=s[x]){ 30 work[x] = true; 31 dfs(x+1, left-s[x]); 32 work[x] = false; 33 dfs(x+1, left); 34 } 35 else dfs(x+1, left); 36 } 37 int main(){ 38 cin>>ss; 39 int i; 40 for(i = 1; i <= 15; i++) 41 cin>>w[i]>>s[i]; 42 dfs(1,ss); 43 cout<<maxsum<<endl; 44 return 0; 45 }
备注:dfs水题,数据很小。最开始少写了标黄行。一定要注意dfs考虑所有情况!