• 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 }
  • 相关阅读:
    各语言最原始数据库访问组件封装DBHelper
    Andorid 之日历控件,可左右滑动,包含公历,农历,节假日等
    Andorid 之日历控件,可左右滑动,包含公历,农历,节假日等
    Andorid 之日历控件,可左右滑动,包含公历,农历,节假日等
    Andorid 之日历控件,可左右滑动,包含公历,农历,节假日等
    如何学习Python?
    如何学习Python?
    如何学习Python?
    如何学习Python?
    写颗搜索二叉树动动脑,开启今年的旅程,新年快乐
  • 原文地址:https://www.cnblogs.com/tt123/p/3293222.html
Copyright © 2020-2023  润新知