BZOJ 4247: 挂饰

背包裸题

#include<cstdio>
#include<algorithm>
using namespace std;
int F[2005];
struct node{
	int x,y;
}a[1000005];
bool cmp(node a,node b){
	return a.x>b.x;
}
int main(){
	int n;
	scanf("%d",&n);
	for (int i=1; i<=n; i++){
		scanf("%d%d",&a[i].x,&a[i].y);
		a[i].x--;
	}
	sort(a+1,a+n+1,cmp);
	for (int i=0; i<=n; i++) F[i]=-2e9;
	F[1]=0;
	for (int i=1; i<=n; i++){
		if (a[i].x>=0){
			for (int j=n; j>=0; j--)
				F[min(j+a[i].x,n)]=max(F[min(j+a[i].x,n)],F[j]+a[i].y);
		}
		else{
			for (int j=-a[i].x; j<=n; j++)
				F[j+a[i].x]=max(F[j+a[i].x],F[j]+a[i].y);
		}
	}
	int ans=0;
	for (int i=0; i<=n; i++) ans=max(ans,F[i]);
	printf("%d\n",ans);
	return 0;
}

  

posted @ 2018-11-05 14:48  ~Silent  阅读(115)  评论(0编辑  收藏  举报
Live2D