题意:
要求建长度为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; }