acdreamoj 瑶瑶饿了 完全背包

瑶瑶饿了

Submit Statistic  Next Problem

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 ;
}

你可能感兴趣的:(acdreamoj 瑶瑶饿了 完全背包)