题目链接点这儿
先跑个最短路,然后在最短路的基础上跑个多重背包。
开始看错了,以为是分组背包 囧
#include <bits/stdc++.h>
#define up(i, lower, upper) for(int i = lower; i < upper; i++)
#define down(i, lower, upper) for(int i = upper-1; i >= lower; i--)
using namespace std;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef vector<int> vi;
typedef vector<pii> vpii;
typedef long long ll;
typedef unsigned long long ull;
const double pi = acos(-1);
const double eps = 1.0e-9;
template<class T>
inline bool read(T &n){
T x = 0, tmp = 1; char c = getchar();
while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
if(c == EOF) return false;
if(c == '-') c = getchar(), tmp = -1;
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
n = x*tmp;
return true;
}
template <class T>
inline void write(T n) {
if(n < 0) {
putchar('-');
n = -n;
}
int len = 0,data[20];
while(n) {
data[len++] = n%10;
n /= 10;
}
if(!len) data[len++] = 0;
while(len--) putchar(data[len]+48);
}
///---------------------------------------------------------
const int maxn = 110 ;
const int maxT = 1100 ;
int n , m , T ;
int x[maxn] , w[maxn] , t[maxn] , dis[maxn];
int atlas[maxn][maxn] ;
ll f[maxT] ;
int main() {
scanf("%d%d%d",&n,&m,&T) ;
for(int i = 1 ; i <= n ; i++) read(x[i]), read(w[i]), read(t[i]);
memset(atlas , 0x3f , sizeof(atlas)) ;
for(int i = 0 ; i <= n ; i++) atlas[i][i] = 0 ;
for(int i = 0 ; i < m ; i++) {
int xi , yi , bi;
read(xi), read(yi), read(bi);
atlas[xi][yi] = min(atlas[xi][yi] , bi) ;
}
for(int k = 0 ; k <= n ; k++)
for(int i = 0 ; i <= n ; i++)
for(int j = 0 ; j <= n ; j++)
atlas[i][j] = min(atlas[i][j] , atlas[i][k] + atlas[k][j]) ;
for(int i = 0 ; i <= n ; i++) dis[i] = atlas[0][i] ;
for(int i = 1 ; i <= n ; i++)
for(int ti = T ; ti >= 0 ; ti--) {
int j = ti + dis[i] ;
for(int k = 1 ; k <= x[i] ; k++) {
if(j + k*t[i] > T) break ;
f[j+k*t[i]] = max(f[j+k*t[i]] , f[ti]+k*w[i]) ;
}
}
write(f[T]); puts("");
return 0 ;
}