1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
#include <bits/stdc++.h> #define FOR(i, a, b) for (int i = a; i <= b; ++i) #define ROF(i, a, b) for (int i = a; i >= b; --i) #define all(x) x.begin(),x.end() #define CLR(i,a) memset(i,a,sizeof(i)) #define fi first #define se second
using namespace std;
typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pll; typedef array<ll,3> arr; typedef double DB; const ll MAXN=510,INF=static_cast<ll>(5e18)+3;
ll N,Vol,K; arr A[MAXN];
ll dp[MAXN][50010];
inline bool cmp(arr a,arr b){ return a[2]<b[2]; } struct Things{ ll yen,u,c; }T[MAXN]; pll Len[MAXN]; ll combDp[MAXN][50010]; ll colLim;
ll dfs(ll curCol,ll usedVol){ if(curCol>colLim) return 0; if(usedVol>=Vol) return 0; if(combDp[curCol][usedVol]!=-1) return combDp[curCol][usedVol]; ll res=0; ROF(i,Vol-usedVol,0){ ll lres=0; if(dp[curCol][i]==0){ lres=dfs(curCol+1,usedVol); res=max(lres,res); break; } lres=dp[curCol][i]+K; lres+=dfs(curCol+1,usedVol+i); res=max(lres,res); } combDp[curCol][usedVol]=res; return res; }
int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>N>>Vol>>K; FOR(i, 1, N){ cin>>A[i][0]>>A[i][1]>>A[i][2]; } sort(&A[1],&A[N+1],cmp); ll idx=0; T[1].yen=A[1][0],T[1].u=A[1][1],T[1].c=++idx; FOR(i,2,N){ if(A[i-1][2]!=A[i][2]){ T[i].c=++idx; }else{ T[i].c=idx; } T[i].yen=A[i][0],T[i].u=A[i][1]; } Len[1].fi=1; Len[idx].se=N; FOR(i,2,N){ if(T[i].c!=T[i-1].c){ Len[T[i-1].c].se=i-1; Len[T[i].c].fi=i; } } FOR(i,1,idx){ FOR(j,Len[i].fi,Len[i].se){ ll yen=T[j].yen,val=T[j].u; ROF(k,Vol,1){ if(k<yen) break; dp[i][k]=max(dp[i][k],dp[i][k-yen]+val); } } } colLim=idx; FOR(i,0,idx){ FOR(j,0,Vol){ combDp[i][j]=-1; } } FOR(i,1,idx){ cerr<<dp[i][0]<<'\n'; } cout<<dfs(1,0)<<'\n'; return 0; }
|