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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【解决方案】“‘javac’不是内部或外部命令,也不是可运行的程序或批处理文件”「建议收藏」

    【解决方案】“‘javac’不是内部或外部命令,也不是可运行的程序或批处理文件”「建议收藏」简述在学着使用Java的命令行来编译java文件的时候,遇到了这个问题Windows操作系统“‘javac’不是内部或外部命令,也不是可运行的程序或批处理文件”下面就讲讲解决方法解决过程根据探究的情况来看,这里其实是没有安装好(或者是安装了之后但是在环境变量上却没有设置好)第一步:在http://www.oracle.com/technetwork/java/ja…

    2022年5月8日
    77
  • ubuntu解决vim打开文件时报错E325ATTENTION「建议收藏」

    ubuntu解决vim打开文件时报错E325ATTENTION「建议收藏」ubuntu解决vim打开文件时报错E325ATTENTION

    2022年5月12日
    44
  • C语言大数运算-乘除法篇「建议收藏」

    C语言大数运算-乘除法篇「建议收藏」前言:这是第三篇博客,也是一次介绍二个计算的博客,可能难度会比前两篇博客大一点,所以建议对于初学者来说一定要看完我的前两篇博客再来看本篇博客,关于本次实验的环境,和思想在第一篇博客已经简单介绍过了,所以不再赘述,我会先介绍大数的乘法载介绍大数的除法,乘法的难点在于要使用一个嵌套循环,除法的难点在于一个字使用符串比较方法的技巧,本次还是会将算法都写成函数,然后在main()函数中调用,原因是在第四

    2022年10月7日
    3
  • oracle锁表处理三步骤

    oracle锁表处理三步骤selectsession_idfromv$locked_object; –425SELECTsid,serial#,username,osuserFROMv$sessionwheresid=425;ALTERSYSTEMKILLSESSION’425,9613′;

    2022年6月16日
    33
  • snmp trap 接收_amtrak

    snmp trap 接收_amtrak在进行winsnmp及其它api进行snmp开发时,基本上都会有一个接收trap的功能

    2022年8月20日
    5
  • CDatabase::ExecuteSQL()

    CDatabase::ExecuteSQL()CDatabase::ExecuteSQLCallthismemberfunctionwhenyouneedtoexecuteaSQLcommanddirectly.当你要直接执行SQL命令的时候就访问这个成员函数voidExecuteSQL(  LPCTSTRlpszSQL );lpszSQLPointertoanull

    2022年5月21日
    31

发表回复

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

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