n个蛋糕选一半,使得val最大。dp[i][j]表示前i个蛋糕选j个最大的val,则dp[i][j] = max(dp[i-1][j] , dp[i-1][j-1] + cake[i].a) , j <= i/2; 递推前按b排序
#include <bits/stdc++.h>
using namespace std;
#define MAXN 800
int dp[MAXN+10][MAXN+10];
struct cake
{
int a , b;
}arr[MAXN+10];
bool cmp(cake c1 , cake c2)
{
return c1.b > c2.b;
}
int main()
{
int t , n;
scanf("%d" , &t);
while(t--)
{
scanf("%d" , &n);
for(int i = 1 ; i <= n ; i ++)
{
scanf("%d %d" , &arr[i].a , &arr[i].b);
}
sort(arr + 1, arr + n + 1, cmp);
memset(dp , 0 , sizeof(dp));
for(int i = 1 ; i <= n ; i ++)
{
for(int j = 1 ; j <= i / 2 ; j ++)
{
dp[i][j] = max(dp[i-1][j] , dp[i-1][j-1] + arr[i].a);
}
}
printf("%d\n" , dp[n][n/2]);
}
return 0;
}