zoukankan      html  css  js  c++  java
  • 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
    ",v);
                continue;
            }
            if(v-sum>=5)
            {
                printf("%d
    ",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
    ",v);
        }
        return 0;
    }
    


  • 相关阅读:
    常用的汇编指令与技巧
    汇编调用c函数为什么要设置栈
    lp2356
    String函数的总结
    2019-5-22训练
    STL——substr
    STL 反转函数 (reverse() )
    2019-5-15训练——深搜
    高精度加法
    八皇后题解
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3180226.html
Copyright © 2011-2022 走看看