ZOJ 3703 Happy Programming Contest(01背包的灵活运用)

一道模拟刷题的题:

输出能够获得的最高的分值;如果有相同的,输出做题数量多的;如果还有相同的,输出罚时少的。

/*
Problem :
Status  :

By wf,
*/

#include "algorithm"
#include "iostream"
#include "cstring"
#include "cstdio"
#include "string"
#include "stack"
#include "cmath"
#include "queue"
#include "set"
#include "map"

#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1

typedef long long ll;
using namespace std;

const int inf=0x3f3f3f3f;
const int maxn=1e5+5;

int alltime,n;
struct P
{
    int time,attr;
}p[maxn];

bool cmp(P b, P c)
{
    return b.time<c.time;
}

struct Node
{
    int time;  //提交时间
    int attr;  //总吸引力
    int num;   //解决的题目数量
    int pena;  //总罚时
}dp[maxn];

void print_arr(int a[],int n)
{
    for(int i=0; i<n; ++i)
    {
        printf("%d ",a[i]);
    }
    printf("
");
}

int main()
{
    //freopen("in.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(dp,0,sizeof dp);

        scanf("%d %d",&alltime,&n);

        for(int i=0; i<n; ++i)
        {
            scanf("%d",&p[i].time);
        }
        //sort(mytime,mytime+n);
        //print_arr(time,n);
        for(int i=0; i<n; ++i)
        {
            scanf("%d",&p[i].attr);
        }

        sort(p,p+n,cmp); // 不排序会错

        for(int i=0;i<n;++i)
        {
            for(int v = alltime;v>=0;v--)
            {
                if( v<p[i].time )continue;

                if( dp[v].attr < dp[ v-p[i].time ].attr + p[i].attr )
                {
                    dp[v].attr = dp[ v-p[i].time ].attr + p[i].attr;
                    dp[v].num = dp[ v-p[i].time ].num + 1;
                    dp[v].time = dp[ v-p[i].time ].time + p[i].time;
                    dp[v].pena = dp[ v-p[i].time ].pena + dp[v].time;
                }
                else if( dp[v].attr == dp[ v-p[i].time ].attr + p[i].attr )
                {
                    if( dp[v].num < dp[ v-p[i].time ].num +1 )
                    {
                        dp[v].num = dp[ v-p[i].time ].num +1;
                        dp[v].time = dp[ v-p[i].time ].time + p[i].time;
                        dp[v].pena = dp[ v-p[i].time ].pena + dp[v].time;
                    }
                    else if( dp[v].num == dp[ v-p[i].time ].num +1 )
                    {
                        if( dp[v].pena > dp[ v-p[i].time ].time + dp[ v-p[i].time ].pena  )
                        {
                            dp[v].time = dp[ v-p[i].time ].time + p[i].time;
                            dp[v].pena = dp[ v-p[i].time ].pena + dp[v].time;
                        }
                    }
                }
            }
        }

        int ans = alltime;
        for(int i = alltime-1 ;i>=0;i--)
        {
            if( dp[ans].attr < dp[i].attr )ans = i;
            else if( dp[ans].attr == dp[i].attr )
            {
                if( dp[ans].num < dp[i].num )ans = i;
                else if( dp[ans].num == dp[i].num )
                {
                    if( dp[ans].pena > dp[i].pena )ans=i;
                }
            }
        }



        printf("%d %d %d
",dp[ans].attr,dp[ans].num,dp[ans].pena);



    }

    return 0;
}

  

原文地址:https://www.cnblogs.com/bruce27/p/5492069.html