[Usaco2006 Dec]Cow Roller Coaster

01背包,难点在于多了一个维度(二维01背包)

有费用(成本这里称“奶牛币”),有价值(有趣指数这里称“fun值”),还有一个限制条件——轨道要求连续,切必须到达终点

既然有两个限制维度,那咱就开一个二维数组:F[i][j](为了避免与变量名重复,我这里使用大写F,代码里用小写f)

F[i][j]表示:从轨道的起点某起点使用轨道,花费j奶牛币,到达该轨道的终点i,可以获得的最大的fun值

于是就有方程:

F[x[i]+w[i]][j]=max(F[x[i]+w[i]][j],F[x[i]][j-c[i]]+f[i])

注意不能到达要输出-1这里直接把最大欢乐值初始设为-1

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct rail
{
	int x,w,f,c;
} r[10001];
int l,n,b,ans,f[1001][1001];
bool cmp(rail x,rail y)
{
	return x.x<y.x;
}
int main()
{
	cin>>l>>n>>b;
	for(int i=1; i<=n; i++)
	{
		cin>>r[i].x>>r[i].w>>r[i].f>>r[i].c;
	}
	sort(r+1,r+1+n,cmp);
	memset(f,-1,sizeof(f));
	f[0][0]=0,ans=-0x3f3f3f3f;
	for(int i=1; i<=n; i++)
	{
		for(int j=b; j>=r[i].c; j--)
		{
			if(f[r[i].x][j-r[i].c]!=-1)
			{
				f[r[i].x+r[i].w][j]=max(f[r[i].x+r[i].w][j],f[r[i].x][j-r[i].c]+r[i].f);
			}
		}
	}
	for(int i=0; i<=b; i++)
	{
		ans=max(ans,f[l][i]);
	}
	cout<<ans;
}
posted @ 2020-01-18 23:15  Winter_Misty  阅读(220)  评论(0编辑  收藏  举报