瑶瑶饿了
Problem Description
你们肯定都不知道从前有个很聪明的妹子,她的名字叫瑶瑶(tsyao)。一天,瑶瑶在自己家里建造了一个魔法阵。她在魔法阵找吃的,这个魔法阵有n种食物,每种食物有xi份,而且每种食物位于魔法阵的不同位置(相同食物位于相同位置)。吃第i种食物,每一份会消耗ti的时间,获得wi的价值。当然这个魔法阵有魔力,每次吃一种食物后瑶瑶会传送回到自己家(耗时0),并且不能再吃该种食物。
另外,从魔法阵x位置到y位置会消耗bi的时间。如果有路能够让瑶瑶从x到达z,从z到达y,那么瑶瑶是可以从x经过z到达y的,但是瑶瑶不能在z点吃东西,否则她又会被送回家。。。。
现在瑶瑶家位于0号位置,她有T的时间吃食物,她想在T时间内吃得最大的价值。
Input
第1行 两个整数n ,m , T;
接下来n行 ,每行三个整数xi,wi,ti,为每种食物的份数xi,价值wi和吃每一份食物的时间ti,第i种食物位于魔法阵位置i;
接下来m行,每行三个整数x,y,bi,表示从位置x到到位置y有一条消耗时间为ti的路(可能有多条从x到y的路)。
Output
输出一行 ,为瑶瑶在T时间内获得的最大价值。
Sample Input
3 5 10 1 1 1 3 2 4 1 10 5 0 1 1 0 2 5 0 3 1 1 2 1 2 3 1
Sample Output
11
Hint
1 ≤ n ≤ 10^2 , 1 ≤ m ≤ 5000 , 1 ≤ T ≤ 10^3 , 1 ≤ xi ≤ 100 ,1≤ wi ≤ 10^7 ,1 ≤ ti,bi ≤ T。
单组输入,共10组数据。
只是在背包前,物品的容量得加上到这个物品的距离。
先Floyd求最短路,再完全背包。
typedef long long LL ;
int dist[108][108] ;
int x[108] , w[108] , t[108] ;
LL dp[1008] ;
int main(){
int n , m , i , j , k , u , v , T , ti ;
while(cin>>n>>m>>T){
for(i = 1 ; i <= n ; i++)
scanf("%d%d%d" ,&x[i] , &w[i] , &t[i]) ;
memset(dist, 31 , sizeof(dist)) ;
for(i = 0 ; i <= n ; i++) dist[i][i] = 0 ;
while(m--){
scanf("%d%d%d" , &u , &v , &j) ;
dist[u][v] = min(dist[u][v] , j) ;
}
for(k = 0 ; k <= n ; k++){
for(i = 0 ; i <= n ; i++){
for(j = 0 ; j <= n ; j++){
dist[i][j] = min(dist[i][j] , dist[i][k] + dist[k][j]) ;
}
}
}
memset(dp , 0 , sizeof(dp)) ;
for(i = 1 ; i <= n ; i++){
for(ti = T ; ti >= 0 ; ti--){
j = ti + dist[0][i] ;
for(k = 1 ; k <= x[i] ; k++){
if(j + k*t[i] > T) break ;
dp[j+k*t[i]] = max(dp[j+k*t[i]] , dp[ti]+k*w[i]) ;
}
}
}
cout<< dp[T] << endl ;
}
return 0 ;
}