codeforces gym #101161H - Witcher Potion(状压DP)
题目链接:
http://codeforces.com/gym/101161/attachments
题意:
总共有n瓶药可供选择
每瓶药可以增加$e_i$点体力,和$p_i$点毒性
每分钟消耗1点毒性,毒性不能大于99,体力不能小于0大于100
击败一只怪物消耗$k$点体力,花费$m$分钟
计算不最大击败怪物的数量
数据范围:
$1\leq n\leq 8$
分析:
定义$dp[i][j][k]$为药物状态为$i$,体力为$j$,毒性为$k$的最大击败数
初始化$dp[0][100][0]=0$
对于每个$dp[i][j][k]$,可以选择击败一只怪物不喝药,或者在$i$状态下,击败一只怪物并且喝一瓶没有喝过的药
ac代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
const int maxn = 1e5+100;
int dp[(1<<8)+7][101][101];
int e[9],p[9],k,m;
int main()
{
int T,d,m,n;
scanf("%d",&T);
while(T--){
scanf("%d %d",&d,&m);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&e[i]);
for(int i=1;i<=n;i++)
scanf("%d",&p[i]);
int len=(1<<n);
for(int i=0;i<len;i++)
for(int j=0;j<=100;j++)
for(int k=0;k<=100;k++)
dp[i][j][k]=-1e9;
dp[0][100][0]=0;
for(int i=0;i<len;i++){
for(int j=100;j>=d+1;j--){
for(int k=0;k<=99;k++){
dp[i][j-d][max(0,k-m)]=
max(dp[i][j][k]+1,dp[i][j-d][max(0,k-m)]);
for(int f=1;f<=n;f++){
if(((1<<(f-1))&i)==0){
if(max(0,k-m)+p[f]<=99)
dp[i+(1<<(f-1))][min(100,j-d+e[f])][max(0,k-m)+p[f]]
=max(dp[i+(1<<(f-1))][min(100,j-d+e[f])][max(0,k-m)+p[f]],
dp[i][j][k]+1);
}
}
}
}
}
int ans=0;
for(int i=0;i<len;i++)
for(int j=0;j<=100;j++)
for(int k=0;k<=99;k++)
ans=max(ans,dp[i][j][k]);
printf("%d\n",ans);
}
return 0;
}
codeforces gym #101161H - Witcher Potion(状压DP)的更多相关文章
- Codeforces Round #363 LRU(概率 状压DP)
状压DP: 先不考虑数量k, dp[i]表示状态为i的概率,状态转移方程为dp[i | (1 << j)] += dp[i],最后考虑k, 状态表示中1的数量为k的表示可行解. #incl ...
- codeforces 8C. Looking for Order 状压dp
题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...
- Codeforces 429C Guess the Tree(状压DP+贪心)
吐槽:这道题真心坑...做了一整天,我太蒻了... 题意 构造一棵 $ n $ 个节点的树,要求满足以下条件: 每个非叶子节点至少包含2个儿子: 以节点 $ i $ 为根的子树中必须包含 $ c_i ...
- Codeforces 895C Square Subsets(状压DP 或 异或线性基)
题目链接 Square Subsets 这是白书原题啊 先考虑状压DP的做法 $2$到$70$总共$19$个质数,所以考虑状态压缩. 因为数据范围是$70$,那么我们统计出$2$到$70$的每个数的 ...
- 【题解】codeforces 8c Looking for Order 状压dp
题目描述 Lena喜欢秩序井然的生活.一天,她要去上大学了.突然,她发现整个房间乱糟糟的--她的手提包里的物品都散落在了地上.她想把所有的物品都放回她的手提包.但是,这里有一点问题:她一次最多只能拿两 ...
- Codeforces 895C Square Subsets:状压dp【组合数结论】
题目链接:http://codeforces.com/problemset/problem/895/C 题意: 给你n个数a[i].(n <= 10^5, 1 <= a[i] <= ...
- CodeForces 599E Sandy and Nuts 状压DP
题意: 有一棵\(n(1 \leq n \leq 13)\)个节点的树,节点的标号为\(1 \sim n\),它的根节点是\(1\). 现在已知它的\(m(0 \leq m < n)\)条边,和 ...
- codeforces 580D Kefa and Dishes(状压dp)
题意:给定n个菜,每个菜都有一个价值,给定k个规则,每个规则描述吃菜的顺序:i j w,按照先吃i接着吃j,可以多增加w的价值.问如果吃m个菜,最大价值是多大.其中n<=18 思路:一看n这么小 ...
- Codeforces 342D Xenia and Dominoes 状压dp
码就完事了. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define ...
随机推荐
- .Net C# RSA签名和验签重写
namespace com._80community.unittest.CUP { /// <summary> /// CUP Client /// </summary> pu ...
- springcloud eureka注册中心分布式配置
最近在学习springcloud,做下笔记以及记下遇到的坑. 1.建立maven工程,结构很简单,一个启动类和一个配置文件,结构如下图所示 2.启动类代码如下,需要添加注册中心注解:EnableEur ...
- IP 、127.0.0.1、localhost 三者区别
一.Ping命令 1.Ping命令,用来检查两台物理机间的TCP/IP网络是否通畅或者网络连接速度,是TCP/IP协议的一部分. 2.PING (Packet Internet Groper),因特网 ...
- C语言两个特别大的整数类型相加超出范围使用两个技巧
技巧1:用long (%ld)或者long long(%lld)类型存取 技巧2:当两个同号的数字相加,放到等号的另一边,变成减号 问题: 给定区间[-2的31次方, 2的31次方]内的3个整数A.B ...
- Java通过JDBC连接SQL Server
下载Microsoft JDBC Driver 4.0 for SQL Server 在这里下载:http://www.microsoft.com/zh-cn/download/details.asp ...
- python之random库的使用以及程序的异常处理
1.random库的使用: random库是使用随机数的Python标准库从概率论角度来说,随机数是随机产生的数据(比如抛硬币),但时计算机是不可能产生随机值,真正的随机数也是在特定条件下产生的确定值 ...
- 使用高德地图JS获取当前位置和经纬度
先看效果,我做的是这样的,可以按地图位置来返回当前你点的位置(图一,二),也可以根据输入框的自动搜索(图三,四) HTML的代码: <div> <input type="t ...
- (2)python开发环境搭建
电脑配置:推荐i7以上处理器,8g内存就ok了,python对电脑还是稍微有点要求的 当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件.要运行代码,就需要 ...
- u-boot移植易用性设置
u-boot移植易用性设置 以下设置使用的u-boot版本为u-boot-2012.04.01 环境参数 在Flash上划分了一块区域用于存储环境变量,所以当u-boot启动时会有如下操作: 读取Fl ...
- Sleep-Join方法理解
package cn.mayday.test; public class JoinTest { public static void main(String[] args) { try { int c ...