博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
榨取kkksc03 多维dp
阅读量:5357 次
发布时间:2019-06-15

本文共 807 字,大约阅读时间需要 2 分钟。

榨取kkksc03 多维dp

题面:

一道简单的动态规划,背包再加一维费用,首先可以易得三维动态规划转移方程

\[ dp[i][j][w]=\left\{ \begin{array}{} max(dp[i-1][j][w], dp[i-1][j-a[i].m][w-a[i].t]+1) \qquad \\ dp[i-1][j][w] \end{array} \right. \]
即当前状态(决策到第\(i\)件物品,已花费\(j\)金钱\(w\)时间)可以由不选这个物品的状态与选了这个物品(如果可以转移)转移而来,其中价值就是已选了多少个物品

而后,类比背包,我们又可以去掉第一维,将三维压到二维。当然,也同背包,\(j\)\(w\)的遍历应为倒序。

核心代码:

for(int i=1;i<=n;i++)        for(int j=m;j>=0;j--)            for(int w=t;w>=0;w--)                if(j-a[i].m>=0&&w-a[i].t>=0)//判断状态是否合法                    f[j][w]=MAX(f[j][w], f[j-a[i].m][w-a[i].t]+1);                else                    f[j][w]=f[j][w];

然而需要注意的是:

  • 状态转移时要注意其合法性
  • 初始化要均初始化为0。因为这样才能使最终f[m][t]的值表示不一定填满[m][n]的背包所获得的最大价值(因为最优解可能没有填满背包,即未用尽金钱与时间);反之,若均初始化为-INF则最终f[m][t]的值表示一定填满[m][n]的背包所获得的最大价值。这一部分可以参考

转载于:https://www.cnblogs.com/santiego/p/9897131.html

你可能感兴趣的文章
linux的子进程调用exec( )系列函数
查看>>
MySQLdb & pymsql
查看>>
zju 2744 回文字符 hdu 1544
查看>>
【luogu P2298 Mzc和男家丁的游戏】 题解
查看>>
前端笔记-bom
查看>>
上海淮海中路上苹果旗舰店门口欲砸一台IMAC电脑维权
查看>>
Google透露Android Market恶意程序扫描服务
查看>>
给mysql数据库字段值拼接前缀或后缀。 concat()函数
查看>>
迷宫问题
查看>>
【FZSZ2017暑假提高组Day9】猜数游戏(number)
查看>>
泛型子类_属性类型_重写方法类型
查看>>
练习10-1 使用递归函数计算1到n之和(10 分
查看>>
Oracle MySQL yaSSL 不明细节缓冲区溢出漏洞2
查看>>
Code Snippet
查看>>
zoj 1232 Adventure of Super Mario
查看>>
组合数学 UVa 11538 Chess Queen
查看>>
oracle job
查看>>
Redis常用命令
查看>>
[转载]电脑小绝技
查看>>
windos系统定时执行批处理文件(bat文件)
查看>>