挂饰[DP]

传送门

我们先将这些挂饰按挂钩个数排序 , 这样保证钩子多的先被选到

f[i][j] 表示选到第i个 , 钩子数位j的最大价值

f[i][j]=max(f[i-1][j],f[i-1][max(j-a[i],0)]+b[i])


#include<bits/stdc++.h>
#define N 2050
using namespace std;
int f[N][N],n,ans;
struct Node{int a,b;}x[N];
bool cmp(Node i,Node j){return i.a>j.a;}
int main(){
	scanf("%d",&n); memset(f,-127,sizeof(f)); f[0][1]=0;
	for(int i=1;i<=n;i++) scanf("%d%d",&x[i].a,&x[i].b);
	sort(x+1,x+n+1,cmp);
	for(int i=1;i<=n;i++)
		for(int j=0;j<=n;j++)
			f[i][j] = max(f[i-1][j],f[i-1][max(j-x[i].a,0)+1]+x[i].b);
	for(int i=0;i<=n;i++) ans = max(ans,f[n][i]);
	printf("%d",ans); return 0;
}

猜你喜欢

转载自blog.csdn.net/sslz_fsy/article/details/84641278