我直接普通混合背包就过了。。。
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000+5;
string a,b;
int n;
int w[maxn],v[maxn],p[maxn];
int f[maxn];
int main(){
cin>>a>>b;
int x=0,xx=0;
for(int i=0;i<=a.length();i++){
if(i==0) while(a[i]!=':'){
x=x*10+(a[i]-'0');
i++;
}else {
while(i<a.length()){
xx=xx*10+(a[i]-'0');
i++;
}
}
}
int y=0,yy=0;
for(int i=0;i<=b.length();i++){
if(i==0) while(b[i]!=':'){
y=y*10+(b[i]-'0');
i++;
}else {
while(i<b.length()){
yy=yy*10+(b[i]-'0');
i++;
}
}
}
int time=y*60+yy-x*60-xx;
cin>>n;
for(int i=1;i<=n;i++){
cin>>w[i]>>v[i]>>p[i];
}
for(int i=1;i<=n;i++){
if(p[i]==0){
for(int j=w[i];j<=time;j++){
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}else if(p[i]==1){
for(int j=time;j>=w[i];j--){
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}else{
for(int j=time;j>=w[i];j--){
for(int k=1;k<=p[i]&&j-w[i]*k>=0;k++){
f[j]=max(f[j],f[j-k*w[i]]+k*v[i]);
}
}
}
}
cout<<f[time]<<endl;
return 0;
}