• Happy Programming Contest(ZOJ3703)(01背包+路径储存)


    Happy Programming Contest  ZOJ3703

    老实说:题目意思没看懂。。。(希望路过的大神指点)

    最后那个the total penalty time是什么意思啊!!!

    还是学到点东西的。。。

    解题的关键在于:要控制最后所用的时间最少,所以在程序的最开始应该先将输入的各种题目 以时间升序排列, 然后就可以保证每次都以时间小的优先选, 这样就可以保证最后相同的吸引值和解题数的情况下所花的时间最少

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <cstring>
     4 #include <cstdio>
     5 #include <algorithm>
     6 using namespace std;
     7 struct Point
     8 {
     9     int t,v;
    10 }p[55];
    11 bool cmp(Point left,Point right)
    12 {
    13     return left.t<right.t;
    14 }
    15 int dp[1005],pen[1005],pro[1005];
    16 int main ()
    17 {
    18     int test;scanf("%d",&test);
    19     while(test--)
    20     {
    21         int len,n;
    22         scanf("%d%d",&len,&n);
    23         memset(dp,0,sizeof(dp));
    24         memset(pro,0,sizeof(pro));
    25         memset(pen,0,sizeof(pen));
    26         for(int i=1;i<=n;++i)
    27             scanf("%d",&p[i].t);
    28         for(int i=1;i<=n;++i)
    29             scanf("%d",&p[i].v);
    30         int ans_val=0,ans_p=0,penalty=0;
    31         sort(p+1,p+1+n,cmp);
    32         for(int i=1;i<=n;++i)
    33         {
    34             for(int j=len;j>=p[i].t;--j)
    35             {
    36                 bool flag=false;
    37                 if(dp[j-p[i].t]+p[i].v>dp[j])
    38                     flag=true;
    39                 else if(dp[j-p[i].t]+p[i].v==dp[j] && pro[j-p[i].t]+1>pro[j])
    40                     flag=true;
    41                 else if(dp[j-p[i].t]+p[i].v==dp[j] && pro[j-p[i].t]+1==pro[j] && pen[j-p[i].t]+j<pen[j])
    42                     flag=true;
    43                 if(flag)
    44                 {
    45                     dp[j]=dp[j-p[i].t]+p[i].v;
    46                     pro[j]=pro[j-p[i].t]+1;
    47                     pen[j]=pen[j-p[i].t]+j;
    48 
    49                 }
    50             }
    51         }
    52         for(int j=0;j<=len;++j)
    53         {
    54             bool flag=false;
    55             if(ans_val<dp[j])
    56                 flag=true;
    57             else if(ans_val==dp[j] && ans_p<pro[j])
    58                 flag=true;
    59             else if(ans_val==dp[j] && ans_p<pro[j] && penalty>pen[j])
    60                 flag=true;
    61             if(flag)
    62             {
    63                 ans_val=dp[j];
    64                 ans_p=pro[j];
    65                 penalty=pen[j];
    66             }
    67         }
    68         printf("%d %d %d
    ",ans_val,ans_p,penalty);
    69     }
    70     return 0;
    71 }
  • 相关阅读:
    SQL大圣之路笔记——SQL 字段中英文字母如何区分大小写
    Python(二十五)
    Python(二十四)
    Python(二十二)
    Python(二十一)
    Python(二十)
    Python(十九)
    Python(十八)
    python(十七)
    python(十六)
  • 原文地址:https://www.cnblogs.com/tt123/p/3293222.html
Copyright © 2020-2023  润新知