zoj3905 贪心dp

来源:互联网 发布:大学生网络危害的案例 编辑:程序博客网 时间:2024/05/02 02:40

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 800int 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;}


0 0
原创粉丝点击