hdu 2546 饭卡(DP)

很久以前做过这道题,晚上睡不着,看见nyist加了一个DP的比赛,就进来打个酱油。

这道题的点睛之笔是将最大值记录下来,然后将其值改为0。之后就是普通的背包了。

 

#include<stdio.h>

#include<string.h>

#define N 1005

int Max(int x,int y)

{

    if(x>y)

        return x;

    else

        return y;

}

int main()

{

    int n;

    int a[N],mark[N];

    while(scanf("%d",&n),n)

    {

        int max,flag;

        int i,j;

        flag=-1;

        max=0;

        int sum=0;

        for(i=0;i<n;i++)

        {

            scanf("%d",&a[i]);

            sum+=a[i];

            if(a[i]>max)

            {

                max=a[i];

                flag=i;

            }

        }

        int v;

        scanf("%d",&v);

        if(v<5)

        {

            printf("%d\n",v);

            continue;

        }

        if(v-sum>=5)

        {

            printf("%d\n",v-sum);

            continue;

        }

        a[flag]=0;

        v-=5;

        memset(mark,0,sizeof(mark));

        for(i=0;i<n;i++)

        {

            for(j=v;j>=a[i];j--)

                mark[j]=Max(mark[j],mark[j-a[i]]+a[i]);

        }

        v=v+5-mark[v]-max;

        printf("%d\n",v);

    }

    return 0;

}


 

 

你可能感兴趣的:(HDU)