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; }