vijos 1426

P1426兴奋剂检查

Accepted

标签:中学生论坛[显示标签]

背景

北京奥运会开幕了,这是中国人的骄傲和自豪,中国健儿在运动场上已经创造了一个又一个辉煌,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

题解:

一开始读错题了,以为是个裸的01背包
读完题目,跑m组01背包,结果还是22分
于是看了看题解,我惊呆了,6重循环的dp,得亏m比较小要不然早爆了

AC代码i,j这个地方边界处理的很巧妙。

具体看代码吧

22分代码:

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=210;
const int M=5e6+10;
int n,m;
int res,c[6],v[N][6],w[N],f[M];
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++) scanf("%d",&c[i]);
    for(int i=1;i<=n;i++){
        scanf("%d",&w[i]);
        for(int j=1;j<=m;j++){
            scanf("%d",&v[i][j]);
        }
    }
    for(int k=1;k<=m;k++){
        for(int i=1;i<=n;i++){
            for(int j=c[k];j>=v[i][k];j--){
                f[j]=max(f[j],f[j-v[i][k]]+w[i]);
            }
        }
        res=max(res,f[c[k]]);
    }
    printf("%d\n",res);
    return 0;
}

AC代码:

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=210;
const int M=5e6+10;
int n,m,ans,c[6],v[N][6],f[M];
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++) scanf("%d",&c[i]);
    for(int i=1;i<=n;i++){
        for(int j=0;j<=m;j++){
            scanf("%d",&v[i][j]);
        }
    }
    for(int i=1,j,k;i<=n;i++){
        for(int a1=c[1];a1>=v[i][1];a1--){
            for(int a2=c[2];a2>=v[i][2];a2--){
                for(int a3=c[3];a3>=v[i][3];a3--){
                    for(int a4=c[4];a4>=v[i][4];a4--){
                        for(int a5=c[5];a5>=v[i][5];a5--){
                            j=(((a1*(c[2]+1)+a2)*(c[3]+1)+a3)*(c[4]+1)+a4)*(c[5]+1)+a5;
                            k=((((a1-v[i][1])*(c[2]+1)+(a2-v[i][2]))*(c[3]+1)+(a3-v[i][3]))*(c[4]+1)+(a4-v[i][4]))*(c[5]+1)+a5-v[i][5];
                            ans=max(ans,f[j]=max(f[j],f[k]+v[i][0]));
                        }
                    }
                }
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}
时间: 2024-10-12 01:10:00

vijos 1426的相关文章

vijos 1426 背包+hash

背景 北京奥运会开幕了,这是中国人的骄傲和自豪,中国健儿在运动场上已经创造了一个又一个辉煌,super pig也不例外……………… 描述 虽然兴奋剂是奥运会及其他重要比赛的禁药,是禁止服用的.但是运动员为了提高成绩难免要服用一些,super pig也不例外.为了不被尿检检查出来,这些药品就只能选一些不容易被发现的来服用.但是奥委会关于兴奋剂检查有很多个指标,只有尿检中各项数值均不高于规定指标才算成阴性(“你没服兴奋剂”),所以如何服用适量的药品使自己的水平达到最高是每个运动员困扰的问题. 现在有

兴奋剂检查(vijos 1426)

背景 北京奥运会开幕了,这是中国人的骄傲和自豪,中国健儿在运动场上已经创造了一个又一个辉煌,super pig也不例外……………… 描述 虽然兴奋剂是奥运会及其他重要比赛的禁药,是禁止服用的.但是运动员为了提高成绩难免要服用一些,super pig也不例外.为了不被尿检检查出来,这些药品就只能选一些不容易被发现的来服用.但是奥委会关于兴奋剂检查有很多个指标,只有尿检中各项数值均不高于规定指标才算成阴性(“你没服兴奋剂”),所以如何服用适量的药品使自己的水平达到最高是每个运动员困扰的问题. 现在有

vijos P1426兴奋剂检查 多维费用背包问题的hash

https://vijos.org/p/1426 这是个好题,容易想到用dp[i][v1][v2][v3][v4][v5]表示在前i个物品中,各种东西的容量是那个的时候,能产生的最大价值. 时间不会TLE,但是会MLE.所以就需要把那5维状态进行hash 其实就是对这个排列进行一个hash. newState: v1, v2, v3, v4, v5这个排列. oldState: v1 - w[1], v2 - w[2], v3 - w[3], v4 - w[4], v5 - w[5] 这个排列.

Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒[email protected][email protected]). 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT).这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭mx的部队. 战壕都有一个保护范围,同它的攻击

Vijos P1785 同学排序【模拟】

同学排序 描述 现有m位同学,第1位同学为1号,第2位同学为2号,依次第m位同学为m号.要求双号的学生站出来,然后余下的重新组合,组合完后,再次让双号的学生站出来,重复n次,问这时有多少同学出来站着? 样例1 样例输入1 1989 5 样例输出1 1926 限制 1s 提示 [数据范围] 1≤n≤10 100≤m≤100000 题目链接:https://vijos.org/p/1785 分析:站出序号为偶数的人,如果总人数为奇数,剩余人数向上取整再折半就好了! 下面给出AC代码: 1 #incl

Vijos 1057 盖房子

二次联通门 : Vijos 1057 盖房子 /* Vijos 1057 盖房子 简单的dp 当前点(i, j)所能构成的最大的正方形的边长 为点(i - 1, j - 1)与(i, j - 1), (i - 1, j)三点中最小的边长构成.. 一遍递推, 一边取最大即可 */ #include <cstdio> #define Max 1009 inline int min (int a, int b) { return a < b ? a : b; } inline int max

Vijos 1193 扫雷 【动态规划】

扫雷 描述 相信大家都玩过扫雷的游戏.那是在一个n*n的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,"余"任过流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和他8连通的格子里面雷的数目.现在棋盘是n*2的,第一列里某些格子是雷,而第二列没有雷,如:o 1* 2* 3* 2o 2* 2* 2 ('*'代表有雷,'o'代表无雷)由于第一类的雷有可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息求第一列雷有多少中摆放方案.

Vijos 1523 贪吃的九头龙 【树形DP】

贪吃的九头龙 背景 安徽省芜湖市第二十七中学测试题 NOI 2002 贪吃的九头龙(dragon) Description:OfficialData:OfficialProgram:Converted by JackDavid127 描述 传说中的九头龙是一种特别贪吃的动物.虽然名字叫"九头龙",但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然也会有旧头因衰老而自己脱落. 有一天,有M个脑袋的九头龙看到一棵长有N个果子的果树,喜出望外,

vijos P1448 校门外的树

描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,K=1,读入l.r表示在区间[l,r]中种上一种树,每次操作种的树的种类都不同K=2,读入l,r表示询问l~r之间能见到多少种树(l,r>0) 输入格式 第一行n,m表示道路总长为n,共有m个操作接下来m行为m个操作 输出格式 对于每个k=2输出一个答案 提示 范围:20%的数据保证,n,m<=10060%的数据保证