Java 解洛谷PP5322 [BJOI2019] 排兵布阵,包含完整的分组背包状态转移方法说明,通俗易懂
01.题目及链接
题目链接:https://www.luogu.com.cn/problem/P5322
02.分组背包说明
分组背包:有k组物品,N个物品,一个容量是C的背包。每组物品有若干个,同一组内的物品最多只能选一个。
状态转移方程
定义状态: dp[k][j] 最大承重为j,有前k组物品可选时的最大价值
for (int k = 1; k <= groupNum; k++) {// 所属组kfor (int j = 0; j <= capacity; j++) {// 容量jfor (int i = 0; i < I; i++) {// 所属分组k的物品Idp[k][j]=Math.max(dp[k - 1][j],dp[k - 1][j - 物品i的重量] + 物品i的价值);}}
}
状态转移方程压缩
定义状态:dp[j] 最大容量为j的前提下,物品的最大价值
for (int k = 1; k <= groupNum; k++) {// 所属组kfor (int j = capacity; j >= 0; j--) {// 容量jfor (int i = 0; i < I; i++) {// 所属分组k的物品Idp[j]=Math.max(dp[j], dp[j-data[i][0]]+data[i][1]);}}
}
03.解题思路
题意分析:小 C 通过某些途径得知了其他 s 名玩家即将使用的策略,他想知道他应该使用什么策略来最大化自己的总分==>小C的调兵策略只有一个,不能动态改变调兵策略
算法执行流程
- 分别对按座城堡对每一个玩家派去的士兵数量升序排序
- 状态定义:分组的组是城堡的个数(假设为k),定义状态dp[i]:表示士兵人数为i时小 C 总分的最大值
- 状态转移:
dp[j]=Math.max(dp[j], dp[j-2*(第i个人派去第k座城堡的数量)-1]+k*i);
04.具体代码
public static void main(String[] args) throws IOException {BufferedReader in=new BufferedReader(new InputStreamReader(System.in));String[] tmps=in.readLine().split(" ");// s名玩家 n座城堡(组) 玩家有 m名士兵(容量)int s=Integer.valueOf(tmps[0]),n=Integer.valueOf(tmps[1]),m=Integer.valueOf(tmps[2]);int[][] data=new int[s+1][n+1];for (int i = 1; i <= s; i++) {tmps=in.readLine().split(" ");for (int j = 1; j <= n; j++) {data[i][j]=Integer.valueOf(tmps[j-1]);}}//数组按列进行排序(从小到大排序)for (int j = 1; j <= n; j++) {int[] tmp=new int[s+1]; for (int i = 1; i <= s; i++) {tmp[i]=data[i][j];}Arrays.sort(tmp);for (int i = 1; i <= s; i++) {data[i][j]=tmp[i];}}int[] dp=new int[m+1];for (int k = 1; k <= n; k++) {for (int j = m; j >= 1; j--) {for (int i = 1; i <= s; i++) {if(j>=2*data[i][k]+1) dp[j]=Math.max(dp[j], dp[j-2*data[i][k]-1]+k*i);}}}System.out.println(dp[m]);in.close();}
05.更多背包学习
https://blog.csdn.net/qq_46237746/article/details/123908504
Java 解洛谷PP5322 [BJOI2019] 排兵布阵,包含完整的分组背包状态转移方法说明,通俗易懂相关推荐
- 洛谷P5322 [BJOI2019] 排兵布阵 题解
洛谷P5322 [BJOI2019] 排兵布阵 题解 题意:小 C 正在玩一款排兵布阵的游戏.在游戏中有 n n n 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 m m m 名士兵,可以向第 ...
- 洛谷 P5322 [BJOI2019]排兵布阵
P5322 [BJOI2019]排兵布阵 题目大意:玩游戏~~,对于 n 个城堡,有 m 个士兵可以分别派遣到这些城堡. 同时我们有 s 个对手,在每个城堡都会与每个玩家单独比拼,在第 i 个城堡与每 ...
- 洛谷P5322 [BJOI2019]排兵布阵【分组背包】
题目描述 小 C 正在玩一款排兵布阵的游戏.在游戏中有 n 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 m 名士兵,可以向第 i 座城堡派遣 a_i名士兵去争夺这个城堡,使得总士兵数不超过 ...
- 【背包DP练习】洛谷 P5020货币系统 P1757通天之分组背包 P1064[NOIP2006 提高组]金明的预算方案 P5322 [BJOI2019]排兵布阵
洛谷 P5020货币系统 https://www.luogu.com.cn/problem/P5020 思路是把货币从小到大排序,然后按顺序依次完全背包dp,每次dp检查i-1种面值的货币能不能凑出第 ...
- [BJOI2019] 排兵布阵(分组背包)
[BJOI2019] 排兵布阵 题目描述 小 C 正在玩一款排兵布阵的游戏.在游戏中有 nnn 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 mmm 名士兵,可以向第 iii 座城堡派遣 ai ...
- P5322 [BJOI2019] 排兵布阵
P5322 [BJOI2019] 排兵布阵 Summary: Description 小 C 正在排兵布阵.有 n n n 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 m m m 名士兵,可 ...
- P5322 BJOI2019 排兵布阵
P5322 BJOI2019 排兵布阵 本题主要考察对模型的转化能力. 首先要察觉两条性质: 对于一个城堡,想打败一个玩家的同时用最少的士兵,肯定是正好派出这个玩家在这个城堡派出的士兵数量的二倍加一名 ...
- [BJOI2019]排兵布阵
排兵布阵 题解 今天比赛上这道题好像是人均题呀. 好吧,就一个简单的,连优化都不需要的背包dp. 我们每次只需要处理在比第i个城堡的第j大的玩家大的情况,不必把所有的兵的情况都处理完. 然后就可以过了 ...
- Java解洛谷P6771 [USACO05MAR]Space Elevator 太空电梯,包含完整的多重背包状态转移方程,大量注释,通俗易懂
01.题目及链接 题目链接:https://www.luogu.com.cn/problem/P6771 02.多重背包状态转移方程说明 了解多重背包 有 N 种物品和一个容量是 V 的背包,每种物品 ...
最新文章
- python函数赋值函数_python 函数参数赋值过程
- python意外缩进引发逻辑错误_如何编写 Python 程序
- 同步代码和异步代码_告别异步代码
- 学习资料(不定更新)
- SIP与RTP综合应用5-RTP解包过程
- java导入导出有版本兼容问题_java导入excel时遇到的版本问题
- poj 3841 Double Queue (AVL树入门)
- 饮冰三年-人工智能-Python-11之HelloWorld
- ubuntu nsight使用
- caffe安装+Ubuntu16.04+三显卡gpu加速
- 快速原型制造_快速原型初学者指南
- 哲学家就餐问题-中断解决
- 2022牛客多校J题 Serval and Essay
- excel单元格斜线_最实用的8个Excel操作技巧,1分钟学会!
- 离散数学与计算机专业的关系是什么,离散数学跟计算机专业有什么关系?
- iPhone 12 pro max卡槽怎么插双卡
- 【Java基础】使用swing对话框编写一个程序:输入长和宽,计算矩形的周长和面积
- ASP 3.0高级编程(一)
- 05_大数据技术之Spark内核解析(1.1)
- mysql物理读 逻辑读百分比_监控程序MYSQL - 子木清风 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...