rt,不能直接 DP 吗?设 fi,j 表示考虑前 i 个挂饰,还有 j 个挂钩没用的答案
fi−1,j→fi,j,fi−1,j+bi→fi,j+ai−1
我这样写为什么 WA 30pts?
#include<bits/stdc++.h>
using namespace std;
const int N=2001;
int f[N][N];
int read() {
int x=0; bool f=true; char c=0;
while (!isdigit(c) ) f&=(c^'-'),c=getchar();
while (isdigit(c) ) x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f?x:-x;
}
int main()
{
memset(f,0xaf,sizeof f);
int n=read(); f[0][1]=0;
for (int i=1;i<=n;i++)
{
int a=read(),b=read();
for (int j=0;j<=n;j++) {
f[i][j]=max(f[i][j],f[i-1][j]);
if (j+a) f[i][min(j+a-1,n)]=max(f[i][min(j+a-1,n)],f[i-1][j]+b);
}
}
int ans=0;
for (int i=0;i<=n;i++)
ans=max(ans,f[n][i]);
return !printf("%d",ans);
}