HDU 4778 Gems Fight!(dp)

HDU 4778 Gems Fight!(dp)

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

HDU 4778 Gems Fight!

题目链接

题意:有n个背包,包里有一些宝石,如今爱丽丝和你轮流选背包,把包里宝石丢到锅中,然后假设锅中有宝石数量到s个,就会得到魔法石,而且能够继续选背包,两人都按最优策略去取,问最后两人魔法石会差多少。

思路:dp,dp[s]表示选背包状态为s时候的值,然后去记忆化搜索就可以,注意假设当前生成魔法石就继续加,否则就减就可以

代码:

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int INF = 0x3f3f3f3f;const int N = 21;int g, b, s, dp[(1<<N) + 5], vis[(1<<N) + 5];int yu[(1<<N) + 5][10];struct Page {    int num;    int a[10];} p[N];int cal(int S, int u) {    int ans = 0;    for (int i = 1; i <= g; i++) {	ans += (yu[S][i] + p[u].a[i]) / s;    }    return ans;}int dfs(int now) {    int &tmp = dp[now];    if (vis[now]) return tmp;    vis[now] = 1;    tmp = 0;    int Min = INF, Max = -INF;    if (now == (1<<b) - 1) return tmp;    for (int i = 0; i < b; i++) {	if (now&(1<<i)) continue;	int sb = cal(now, i);	int next = (now|(1<<i));	if (sb != 0) {	    Max = max(Max, dfs(next) + sb);	}	else {	    Min = min(Min, dfs(next));	}    }    tmp = max(Max, -Min);    return tmp;}int main() {    while (~scanf("%d%d%d", &g, &b, &s) && g || b || s) {	for (int i = 0; i < b; i++) {	    memset(p[i].a, 0, sizeof(p[i].a));	    scanf("%d", &p[i].num);	    int tmp;	    for (int j = 0; j < p[i].num; j++) {		scanf("%d", &tmp);		p[i].a[tmp]++;	    }	}	for (int i = 0; i < (1<<b); i++) {	    vis[i] = 0;	    for (int j = 0; j < b; j++) {		if (i&(1<<j)) continue;		for (int k = 1; k <= g; k++) {		    yu[i|(1<<j)][k] = (yu[i][k] + p[j].a[k]) % s;		}	    }	}	printf("%d\n", dfs(0));    }    return 0;}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118659.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月3日 上午6:00
下一篇 2021年12月3日 上午7:00


相关推荐

  • python产生随机数的方法_产生随机数的函数

    python产生随机数的方法_产生随机数的函数Python产生随机数:一.Python自带的random库1.参生n–m范围内的一个随机数:random.randint(n,m)2.产生0到1之间的浮点数:random.random()3.产生n—m之间的浮点数:random.uniform(1.1,5.4)4.产生从n—m间隔为k的整数:random.randrange(n,m,k)5.从序列中随机选取一个元素:random.choice([1,2,3,4,5,6,7

    2022年10月4日
    5
  • Pycharm运行python程序画图不能显示

    Pycharm运行python程序画图不能显示Pycharm 运行 python 程序画图不能显示 1 Pycharm 专业版不显示图片 社区版请看 2 Pycharm 从 2017 3 版之后 将 matplotlib 的绘图的结果默认显示在 SciView 窗口中 而不是弹出独立的窗口 可以通过如下方式修改 弹出独立窗口 File Settings Tools PythonScient Showplotsint 将对勾去掉 应用之后再运行就可以独立显示图片 2 Pycharm 社区版不显示图片 或 1 不起作用 由于 matpl

    2026年3月27日
    2
  • HDU 1711 Number Sequence(算法验证)

    HDU 1711 Number Sequence(算法验证)

    2022年1月3日
    52
  • 从零开始学习java一般需要多长时间?「建议收藏」

    从零开始学习java一般需要多长时间?「建议收藏」其实学java一般要多久?因人而异,例如一个零基础的小白自学java,每天学习8个小时来算,而且在有学习资料的基础上,每天学习,从零到找到工作,起码要半年起步,而且还要有项目经验,否则是不会有公司要你的。而一个有一些基础的人,在经过有人系统的教学后,是可以很快学会掌握java的,大概3个月左右。不过java相对于C,C++java而言,java无疑简单了很多,不需要指针,不需要销毁对象,使得对ja…

    2022年7月7日
    27
  • 如何查看SQL Server的端口号

    如何查看SQL Server的端口号一 在 SSMS 中新建查询语句 execsys sp readerrorlog 1 listening 所以我的端口号是 1433 二 在 SQL 配置管理器查看搜素 SQL 也可以查询到是 1433 从 https blog csdn net wangchaoqi19 article details 看到的 自己实践了一下

    2026年3月26日
    2
  • 在线客服系统源码(PHP完全开源版)

    在线客服系统源码(PHP完全开源版)在线客服系统软件使开发和运营团队能够高速协作,因此要求源码系统能够快速响应业务变化,并快速提供出色的客户和员工服务体验。  在线客服源码演示及获取:https://gitee.com/wang_li989/kfxt  客服沟通问题加起来会成为重大的财务损失。您的组织快速有效地解决这些问题的能力直接影响到未满足的SLA义务和客户体验,这两个方面对公司的成功至关重要。在线客服系统是企业战略的核心组成部分。通过减少识别和解决问题所需的时间,您的组织可以提高客户忠诚度,最大限度地延长正常运行时间,并提供始终如

    2022年7月19日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号