题意:
要求建长度为L的过山车,预算为B,求最大的快乐指数,
思路:
dp[i][j]表示在i点花费j美金的最大快乐值,
状态方程为:if(dp[a[i].x+a[i].w][j+a[i].c]<dp[a[i].x][j]+a[i].f)
dp[a[i].x+a[i].w][j+a[i].c]=dp[a[i].x][j]+a[i].f;
//AC CODE:
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
using namespace std;
const int N = 10005;
struct Point
{
int x,w,f,c;
} a[N];
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}
int dp[1005][1005];
//dp[i][j]表示在i点花费j美金的最大快乐值
int main()
{
int l,n,b,i,j;
while (scanf("%d %d %d",&l,&n,&b)!= EOF)
{
for(i=0; i<n; i++)
scanf("%d %d %d %d",&a[i].x,&a[i].w,&a[i].f,&a[i].c);
qsort(a,n,sizeof(a[0]),cmp);
memset(dp,-1,sizeof(dp));
for(i=0; i<=b; i++)
dp[0][i]=0;//从0开始
for(i=0; i<n; i++)
{
for(j=0; j<b; j++)
{
if(dp[a[i].x][j]==-1||a[i].c+j>b||a[i].x+a[i].w>l)
continue;
if(dp[a[i].x+a[i].w][j+a[i].c]<dp[a[i].x][j]+a[i].f)
dp[a[i].x+a[i].w][j+a[i].c]=dp[a[i].x][j]+a[i].f;
}
}
int max=-1;
for(i=0;i<=b;i++)
if(max<dp[l][i])
max=dp[l][i];
printf("%d\n",max);
}
return 0;
}