http://poj.org/problem?id=3257
n种材料建一条长为L的路,
每种材料的起始地点st,长度len,耐久度fun,花费cost
预算为B,建好一条路的最大耐久度是多少
dp[i][j] 表示 距离为i,花费j时的最大耐久度
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=10005;
const int maxl=1005;
const int maxc=1005;
int L,n,B;
int dp[maxl][maxc];
struct Node{
int st,len,fun,cost;
}a[maxn];
bool cmp(struct Node a,struct Node b){
if (a.st==b.st){
return a.len<b.len;
}
return a.st<b.st;
}
int main(){
cin >> L >> n >> B;
for (int i=0;i<n;i++){
cin >> a[i].st >> a[i].len >> a[i].fun >> a[i].cost;
}
sort(a,a+n,cmp);
memset(dp,-1,sizeof(dp));
dp[0][0]=0;
for (int i=0;i<n;i++){
for (int j=a[i].cost;j<=B;j++){
if (dp[a[i].st][j-a[i].cost]!=-1)
dp[a[i].st+a[i].len][j]=max(dp[a[i].st+a[i].len][j],dp[a[i].st][j-a[i].cost]+a[i].fun);
}
}
int ans=-1;
for (int i=0;i<=B;i++){
ans=max(ans,dp[L][i]);
}
cout << ans << endl;
}