n条线段( 起点,终点,价值,费用) ,选择一些来覆盖 [0,L],注意所选线段不能相交
使价值之和最大?
背包题,而且背包体积要刚好用完
状态第一维放当前的位置(如果放线段编号,emmm好像没法做
f[a[i].y][j]=max(f[a[i].y][j],f[a[i].x][j-a[i].w]+a[i].c);
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std ;
const int N=1e3+3,M=1e5+3;
struct T{
int x,y,w,c;
}a[M];
int cmp(T x, T y){
return x.x<y.x;
}
int L,n,m,f[N][N];
int solve(){
int i,j;
memset(f,-1,sizeof f);
f[0][0]=0;
for(i=1;i<=n;i++)
for(j=m;j>=a[i].w;j--){
if(f[a[i].x][j-a[i].w]!=-1){
f[a[i].y][j]=max(f[a[i].y][j],f[a[i].x][j-a[i].w]+a[i].c);
}
}
int ans=-1;
for(j=0;j<=m;j++) ans=max(ans,f[L][j]);
cout<<ans;
}
signed main(){
int i,t;
cin>>L>>n>>m;
for(i=1;i<=n;i++){
cin>>a[i].x>>t>>a[i].c>>a[i].w;
a[i].y=a[i].x+t;
}
sort(a+1,a+1+n,cmp);
solve();
}