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 }