vijos1426兴奋剂检查(多维费用的背包问题+状态压缩+hash)
背景
北京奥运会开幕了,这是中国人的骄傲和自豪,中国健儿在运动场上已经创造了一个又一个辉煌,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通过服这些药在不被检查出来的条件下所能得到的最高水平提高值
限制
各个测试点1s
按照我的惯例,先上搜索伪代码:
dfs(cur,v[],sum)
{
if cur==n
then
record sum
exit
for(i->1 to m)
if limit[i]-v[i]<w[i]
exit
dfs(cur+1,v[],sum)
for(i->1 to m)
v[i]->v[i]-w[i]
dfs(cur+1,v[],sum+c[i])
}
当然,意识到此题是多维背包后,可以很容易地得出最简单的f[v1][v2][v3][v4][v5]的状态数组。
初始的转移方程就和经典的二维费用的方程差不多,只是多了几维。
然而由于0<=v<=5000000(范围有点问题),这样存储方式一定不行(不过,据说不加优化的背包也可以过哦)。
所以,要放个状态压缩。
(((a1(f[2]+1)+a2)(f[3]+1)+a3)(f[4]+1)+a4)(f[5]+1)+a5
a1,a2,a3,a4,a5代表当前5种药的各自取的量这一状态 ,而f[1~5]是每种药物的限制量
状态转移和上文说的呢,是差不多的
|
100
|
511 | 4432 | ksq2013 | C++ | 2016-08-19 20:28:29 |
#include<stdio.h>
#include<stdlib.h>
using namespace std;
inline int read()
{
int x=0,c=getchar(),f=1;
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>47&&c<58)x=x*10+c-48,c=getchar();
return x*f;
}
int n,m,ans,v[6],w[201][6];
int a1,a2,a3,a4,a5,f[1000001];
inline int hsh(int a,int b,int c,int d,int e)
{
return (((a*(v[2]+1)+b)*(v[3]+1)+c)*(v[4]+1)+d)*(v[5]+1)+e;
}
int main()
{
n=read(),m=read();
for(int i=1;i<=m;i++)
v[i]=read();
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++)
w[i][j]=read();
for(int i=1;i<=n;i++)
for(a1=v[1];a1>=w[i][1];a1--)
for(a2=v[2];a2>=w[i][2];a2--)
for(a3=v[3];a3>=w[i][3];a3--)
for(a4=v[4];a4>=w[i][4];a4--)
for(a5=v[5];a5>=w[i][5];a5--){
int j=hsh(a1,a2,a3,a4,a5);
int k=hsh(a1-w[i][1],a2-w[i][2],a3-w[i][3],a4-w[i][4],a5-w[i][5]);
if(f[k]+w[i][0]>f[j]){
f[j]=f[k]+w[i][0];
if(f[j]>ans)
ans=f[j];
}
}
printf("%d\n",ans);
return 0;
}
vijos1426兴奋剂检查(多维费用的背包问题+状态压缩+hash)的更多相关文章
- vijos P1426兴奋剂检查 多维费用背包问题的hash
https://vijos.org/p/1426 这是个好题,容易想到用dp[i][v1][v2][v3][v4][v5]表示在前i个物品中,各种东西的容量是那个的时候,能产生的最大价值. 时间不会T ...
- 动态规划:HDU3496-Watch The Movie(二维费用的背包问题)
Watch The Movie Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- 动态规划:HDU2159-FATE(二维费用的背包问题)
FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 动态规划:POJ2576-Tug of War(二维费用的背包问题)
Tug of War Time Limit: 3000MS Memory Limit: 65536K Description A tug of war is to be arranged at the ...
- vijos1334 NASA的食物计划(二维费用的背包问题)
背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安 全技术问题一直大伤脑筋,因此在各方压力下终止了航天 飞机的历史,但是此类事情会不会在以后发生,谁也无法 保证,在遇到这类航天问题时,解决方 ...
- hdu - 2660 Accepted Necklace (二维费用的背包问题)
http://acm.hdu.edu.cn/showproblem.php?pid=2660 f[v][u]=max(f[v][u],f[v-1][u-w[i]]+v[i]; 注意中间一层必须逆序循环 ...
- AcWing 8.二维费用的背包问题
#include<iostream> #include<algorithm> #include<cstring> using namespace std ; ; i ...
- 2159 ACM 杭电 杀怪 二维费用的背包+完全背包问题
题意:已知经验值,保留的忍耐度,怪的种数和最多的杀怪数.求进入下一级的最优方案. 思路:用二维费用的背包+完全背包问题 (顺序循环)方法求解 什么是二维费用的背包问题? 问题: 二维费用的背包问题是指 ...
- HDU 3496 (二维费用的01背包) Watch The Movie
多多想看N个动画片,她对这些动画片有不同喜欢程度,而且播放时长也不同 她的舅舅只能给她买其中M个(不多不少恰好M个),问在限定时间内观看动画片,她能得到的最大价值是多少 如果她不能在限定时间内看完买回 ...
随机推荐
- SAML : A SAML stack
http://nzpcmad.blogspot.co.nz/2013/06/saml-saml-stack.html You have an application – .NET, JAVA what ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q36-Q39)
Question 36 You are designing a SharePoint 2010 application. You need to design the application so t ...
- Java Android HTTP实现总结
Java Android HTTP实现总结 Http(Hypertext Transfer Protocol)超文本传输协议,是一个基于请求/响应模式的无状态的协议,Http1.1版给出了持续连接的机 ...
- 好推二维码如何通过应用宝微下载支持微信自动打开APP下载?
好推二维码 官网 http://www.hotapp.cn 1. 为什么使用应用宝微下载? APP下载二维码,通过微信扫描下载的时候,微信目前只支持应用宝微下载,才能在微信里直接打开下载,否则就需要在 ...
- android MediaPlayer API大全已经方法详解(转载)
通过这张图,我们可以知道一个MediaPlayer对象有以下的状态: 1)当一个MediaPlayer对象被刚刚用new操作符创建或是调用了reset()方法后,它就处于Idle状态.当调用了rele ...
- OC 类方法,对象方法,构造方法以及instancetype和id的异同
OC 类方法,对象方法,构造方法以及instancetype和id的异同 类方法: 类方法是可以直接使用类的引用,不需要实例化就可以直接使用的方法.一般写一些工具方法. 类方法: 声明和实现的时候,以 ...
- OC 入门
OC 入门 关键词正确写法: Xcode 错误的写法: xcode iPhone 错误的写法:IPhone iOS 错误的写法:IOS OC 全称: Objective-C 错误的写法:Object- ...
- android [因为开了刷机精灵等软件 导致adb 无法使用]error: could not install *smartsocket* listener: cannot bind
今天 使用 刷机精灵后 在使用android studio 时发现 adb 无法正常使用. 于是 想重启 adb.exe , 直接在DOS里杀掉adb输入:adb kill-server 再启动输 ...
- xdebug + wincachegrind
;;;;;;;php.ini;;;;;;;;;;;;;;;;;; [Xdebug]zend_extension=D:\Xampp\php\ext\php_xdebug.dll;开启自动跟踪xdebug ...
- 分页查询的SQL语句
select * from(select row_number() over (ORDER BY Id DESC) cyqrownum,t.* from [Table_TY_Member] t ) v ...