zoukankan      html  css  js  c++  java
  • Happy Programming Contest

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4995

    0-1背包,按照时间排序保证总时间最小。以后写if-else注意多continue,还有0-1背包不需要多加一维。

    以后注意。

    View Code
    const int MM = 1111;
    #define debug puts("wrong")
    //typedef __int64 int64;
    int N,M;
    int dp[MM][4];
    struct Info{int t,v;}g[MM];
    bool cmp(Info x,Info y) {return x.t==y.t?x.v<y.v:x.t<y.t;}
    /*
    100
    10 5
    2 4 6 8 10
    2 4 6 8 10
    */
    void get_data() {
        int i,j,k;
        scanf("%d%d",&M,&N);
        for(i=1;i<=N;i++) scanf("%d",&g[i].t);
        for(i=1;i<=N;i++) scanf("%d",&g[i].v);
        sort(g+1,g+N+1,cmp);
    }
    void solve() {
        int i,j,k,tmp,t1,tt;
        memset(dp,0,sizeof(dp));
        for(i=1;i<=N;i++) {
            for(j=M;j>=g[i].t;j--) {
                tmp=dp[j-g[i].t][0]+g[i].v;
                if(tmp>dp[j][0]) {
                    dp[j][0]=tmp;
                    dp[j][1]=dp[j-g[i].t][1]+1;
                    dp[j][2]=dp[j-g[i].t][2]+j;
                    continue;
                }
                else if(tmp==dp[j][0]) {
                    tt=dp[j-g[i].t][1]+1;
                    if(tt>dp[j][1]) {
                        dp[j][1]=tt;
                        dp[j][2]=dp[j-g[i].t][2]+j;
                        continue;
                    }
                    else if(tt==dp[j][1]) {
                        t1=dp[j-g[i].t][2]+j;
                        dp[j][2]=f_min(t1,dp[j][2]);
                        continue;
                    }
                }
            //    printf("%d %d %d %d %d\n",i,j,dp[j][0],dp[j][1],dp[j][2]);
            }
        }
        int a1=-1,a2=-1,a3=-1;
        for(i=0;i<=M;i++) {
            if(a1==-1||dp[i][0]>a1) {
                a1=dp[i][0], a2=dp[i][1], a3=dp[i][2];
                continue;
            }
            if(dp[i][0]==a1) {
                if(a2==-1||a2<dp[i][1]) {
                    a2=dp[i][1], a3=dp[i][2];
                    continue;
                }
                if(a2==dp[i][1]) {
                    if(a3==-1||a3>dp[i][2]) a3=dp[i][2];
                }
            }
        }
        printf("%d %d %d\n",a1,a2,a3);
    }
    int main() {
        int ca; scanf("%d",&ca);
        while(ca--) get_data(),solve();
        return 0;
    }
  • 相关阅读:
    SpringMVC视图解析器
    FreeMarker介绍
    一篇很全面的freemarker教程
    request,session,application
    nav布局 在线演示 DIVCSS5
    opacity
    java 某字符串在另一字符串中是否存在
    bochs 使用讲解
    使用VS2015搭建Lua开发环境
    Zip文件格式
  • 原文地址:https://www.cnblogs.com/zhang1107/p/3044693.html
Copyright © 2011-2022 走看看