zoukankan      html  css  js  c++  java
  • 兴奋剂检查(vijos 1426)

    背景

    北京奥运会开幕了,这是中国人的骄傲和自豪,中国健儿在运动场上已经创造了一个又一个辉煌,super pig也不例外………………

    描述

    虽然兴奋剂是奥运会及其他重要比赛的禁药,是禁止服用的。但是运动员为了提高成绩难免要服用一些,super pig也不例外。为了不被尿检检查出来,这些药品就只能选一些不容易被发现的来服用。但是奥委会关于兴奋剂检查有很多个指标,只有尿检中各项数值均不高于规定指标才算成阴性(“你没服兴奋剂”),所以如何服用适量的药品使自己的水平达到最高是每个运动员困扰的问题。

    现在有n个药品,每个药品如服用就必须全部用掉(否则会有副作用)。尿检检查共有m个项目,服用每个药品对于每个检查项目都会得到一定的效果值,这些效果值是累加的;服用每个药品当然还会给super pig一些水平提高值,这些效果也是累加的。现在super pig想把问题交给你来解决,因为吃药归吃药,训练才重要。

    格式

    输入格式

    第一行有两个整数n (0<n<=200)和m (1<=m<=5),分别表示药品数和需要检查的项目;
    第二行m个整数 v1---vm,表示检查各项目的指标(即最高不能超过的值);
    第三行到第n+2行,分别是这n个药品的资料,每行m+1个数。每行第一个数表示服用该药品所得到的水平提高值,第二到第m+1个数分别表示服用这个药品每一项的效果值(分别对应第二行的指标类型)。

    0<= k=1∏m Vk <=5000000

    输出格式

    一个整数,即super pig通过服这些药在不被检查出来的条件下所能得到的最高水平提高值

    样例1

    样例输入1[复制]

     
    5 1
    6
    7 3
    8 5
    3 1
    6 2
    4 3

    样例输出1[复制]

     
    16

    限制

    各个测试点1s

    /*
      五维背包+类似于康托展开的hash判重 
    */
    #include<cstdio>
    #include<iostream> 
    #define M_h 10000020
    #define N 6
    #define M 210
    using namespace std;
    int dp[M_h],limit[N],v[M],w[M][N],n,m,ans;
    int read()
    {
        char c=getchar();int num=0,flag=1;
        while(c<'0'||c>'9'){if(c=='-')flag=-1;c=getchar();}
        while(c>='0'&&c<='9'){num=num*10+c-'0';c=getchar();}
        return flag*num;
    }
    int make_hash(int a,int b,int c,int d,int e)
    {
        return (a*(limit[2]+1)*(limit[3]+1)*(limit[4]+1)*(limit[5]+1)
               +b*(limit[3]+1)*(limit[4]+1)*(limit[5]+1)
               +c*(limit[4]+1)*(limit[5]+1)+d*(limit[5]+1)+e);
    }
    int main()
    {
        n=read();m=read();
        for(int i=1;i<=m;i++)
          limit[i]=read();
        for(int i=1;i<=n;i++)
        {
            v[i]=read();
            for(int j=1;j<=m;j++)
              w[i][j]=read();
        }
        for(int i=1;i<=n;i++)
          for(int a=limit[1];a>=w[i][1];a--)
            for(int b=limit[2];b>=w[i][2];b--)
              for(int c=limit[3];c>=w[i][3];c--)
                for(int d=limit[4];d>=w[i][4];d--)
                  for(int e=limit[5];e>=w[i][5];e--)
                  {
                      int now=make_hash(a,b,c,d,e);
                    int past=make_hash(a-w[i][1],b-w[i][2],c-w[i][3],d-w[i][4],e-w[i][5]);
                    dp[now]=max(dp[now],dp[past]+v[i]);
                    ans=max(ans,dp[now]);
                  }
        printf("%d",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    Python 变量回收
    centos服务器内部开启端口
    mysql启动不起来汇总
    torch中DataLoader加载字典
    torch.meshgrid函数
    如何配置好python脚本的命令行参数
    git忽略文件,.gitignore配置
    jupyter如何解析命令行参数argv
    怎么制作虚拟环境的yaml
    如何提高matplotlib在jupyter中作图的分辨率
  • 原文地址:https://www.cnblogs.com/harden/p/5728650.html
Copyright © 2011-2022 走看看