标签:
busy
致标的一天是很忙的,特别是有一段繁忙时段是最让他头痛的了,因为任务很多,所以他总是为了想办法完美的完成它们而伤神。
现在已知致标的繁忙时间是什么时候、为了使得题目简化、已知一个TIME、表示致标的繁忙时间长度、也可以这么理解,理解为致标要完成很多工作的时间只剩下TIME这么多了,所以称为繁忙时段。
接下来致标可以选择做的工作有N个,致标由经验就可以判断每个工作的性质,我们用3个属性来描述一个工作、分别为D , T , P; D 表示致标给它的定位的价值、T表示做它需要的时间、P表示它属于哪一类工作,所有的工作分两类,一类是A类,这种工作只能做一次、一类是B类,这种工作就可以无限做,但是做它也会得到无异于A类的价值,当然也会消耗相应的时间。
现在大家要快点帮致标解决这一难题啊!
利用剩下的TIME时间里,做工作使得致标获得的工作价值最大。 (请大家注意、数据范围在最后)
输入数据 :
第一行 N , TIME 分别表示 N个工作 、 TIME为剩下的时间;
接下来N行 ,每行2个正整数1个字符 D , T , P ;分别表示该工作的价值、时间、以及属于A或者B类工作;
(数据保证任意P的取值都是A或者B);
输出数据:
一行 : 能带走的最大价值;
busy.in
5 10
2 3 A
2 4 A
2 5 A
2 6 A
5 2 B
busy.out
25
数据范围:
对于10%的数据 N <=10 , TIME <= 100
对于 30%的数据 N<=200 ,TIME <= 3000
对于 50%的数据 N <=1000 TIME <= 10000
对于 100% 的数据 N<=2000 TIME <=20000
对于任意物品的价值 <= 350;
这道题很简单,就是一个01背包+完全背包,
如果不知道怎么做可以百度。
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <iostream> 5 6 using namespace std; 7 int n,T; 8 struct id{int vi,ti,note;};id thi[2003]; 9 int f[20003]; 10 11 int main( ){ 12 scanf("%d%d",&n,&T);char lei; 13 for(int x=1;x<=n;x++){ 14 scanf("%d%d%s",&thi[x].vi,&thi[x].ti,&lei); 15 if(lei==‘A‘)thi[x].note=1;else thi[x].note=0; 16 } 17 18 for(int x=1;x<=n;x++){ 19 if(thi[x].note==0) 20 for(int y=thi[x].ti;y<=T;y++) 21 f[y]=max(f[y],f[y-thi[x].ti]+thi[x].vi); 22 else 23 for(int y=T;y>=thi[x].ti;y--) 24 f[y]=max(f[y],f[y-thi[x].ti]+thi[x].vi); 25 } 26 printf("%d",f[T]); 27 return 0; 28 }
标签:
原文地址:http://www.cnblogs.com/Ateisti/p/5791197.html