dp
每个物品有自身价值和它的挂钩数
看上去挂钩是更重要的,所以我们在考虑时先挂挂钩多的
有些像背包
[i][j]的状态应该是有
1.这个不挂
2.挂上,MAX(上的状态+val ,挂钩+num )
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 const int N=2e3+7; 5 6 int n; 7 int maxx=-0x3f3f3f3f; 8 struct node 9 { 10 int num,val; 11 }a[N]; 12 int dp[N][N<<1]; 13 //当 前i个物品,挂钩有j时,所能取到的 快乐最大值 14 bool cmp(node x,node y) 15 { 16 return x.num>y.num; 17 } 18 19 int main() 20 { 21 ios::sync_with_stdio(false); 22 23 cin>>n; 24 memset(dp,-0x7f,sizeof(dp)); 25 for(int i=1;i<=n;i++) 26 cin>>a[i].num>>a[i].val; 27 28 dp[0][1]=0; sort(a+1,a+1+n,cmp); 29 for(int i=1;i<=n;i++) 30 { 31 for(int j=0;j<=(n*2);j++) 32 { 33 if(j) 34 dp[i][j+a[i].num-1]=max(dp[i-1][j+a[i].num-1],dp[i-1][j]+a[i].val); 35 dp[i][j]=max(dp[i][j],dp[i-1][j]); 36 } 37 } 38 39 for(int i=0;i<=2*n;i++) 40 maxx=max(maxx,dp[n][i] ); 41 42 cout<<maxx; 43 44 return 0; 45 }