问题描述
熊的智商高还是猴子的智商高,这或许是一个很难考究的问题。故事里,吉吉国王一直
标榜自己是最聪明最伟大的猴子国王,他的毛毛也是这么坚信。而我们的熊大和熊二却一直
相信他们熊熊才是最聪明的。于是,在导游光头强的建议下,他们决定来一场 pk。
Pk 的内容是这样的,有 n 个格子,每个格子从左到右的编号依次是 1 到 n(编号也是位
置),每个格子上都有不同美味值的水果(猴子们和熊们都很喜欢吃水果,所以水果对他们
来说很有吸引力)。他们从位置 0 开始出发,手上有 AB 两种卡片,A 卡有 na 张,B 卡片有
nb 张。每次他们可以用掉一张卡片,然后往前跳若干格,跳的格子数就是卡片上的数字。
每跳到一个格子上,就可以吃掉对应格子里面的水果,获得水果的美味值。当然了,我们会
保证当卡片用完的时候,一定刚好跳到第 n 个格子上。卡片一定要用完,不能有剩余。
游戏的结果就是在相同的情况下,谁能获得的水果美味值总和最大。熊熊们想要赢得这
个比赛,于是熊二请求你的帮助。如果你可以帮助他算出最大值,他甚至可以把他最心爱的
蜂蜜分享给你。
输入数据
输入文件 game.in:
输入第一行是 3 个整数 n,na,nb,va,vb,n 表示格子的总数,na 表示 A 种卡片的数量,
nb 表示 B 种卡片的数量,va 表示 A 种卡片上的数,vb 表示 B 种卡片上的数。保证 n 一定等
于 nava+nbvb。
接下来 n 个整数,表示每个格子上水果的美味值,注意美味值有可能是负数。
输出数据
输出文件 game.out:
输出只有一行一个整数,表示卡片用完的时候,最多可以得到的美味值总和。
输入输出样例 1
game.in
3 1 1 2 1
1 2 3
game.out
5
样例 1 解释
先用 1 再用 2,美味值是 4,先用 2 再用 1,美味值是 5。
输入输出样例 2
game.in
4 2 1 1 2
4 3 2 1
game.out
8
样例 2 解释
先用两个 1,再用 2,可以得到的值是 8。
数据范围约定
共计有 20 个测试点。
对于第 1-6 个测试点,保证 na=1,nb<=200,美味值都是小于等于 10000 的正整数。
对于第 7-12 个测试点,保证 1<=na,nb<=12,美味值的绝对值小于等于 10000。
对于 100%的数据,保证 1<=n<=20000,1<=na,nb<=2000,1<=va,vb<=5,va 不等于 vb,美
味值的绝对值不超过 1000000。
求c++代码!
4.游戏智商(game.cpp)
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- GISer Liu 2024-07-25 15:20关注
该回答引用自GPT-3.5, 由博主 GISer Liu 编写:
好的,我们来详细分析并解决这个问题。
问题分析
这个问题可以看作是一个动态规划问题。我们需要找到一种使用卡片的方式,使得在到达第
n
个格子时,获得的美味值总和最大。输入数据
n
:格子的总数na
:A 种卡片的数量nb
:B 种卡片的数量va
:A 种卡片上的数vb
:B 种卡片上的数美味值数组
:每个格子上水果的美味值
输出数据
- 一个整数,表示卡片用完的时候,最多可以得到的美味值总和。
解决思路
状态定义:
- 设
dp[i][j]
表示使用i
张 A 卡片和j
张 B 卡片时,能够获得的最大美味值。
- 设
状态转移:
- 对于每一张 A 卡片,我们可以跳
va
格; - 对于每一张 B 卡片,我们可以跳
vb
格; - 因此,状态转移方程为:
dp[i][j] = max(dp[i-1][j] +美味值[i*va + j*vb], dp[i][j-1] +美味值[i*va + j*vb])
- 对于每一张 A 卡片,我们可以跳
初始化:
dp[0][0] = 0
,表示没有使用任何卡片时,美味值为 0。
结果输出:
- 最终结果为
dp[na][nb]
。
- 最终结果为
代码实现
下面是完整的 C++ 代码实现:
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { // 读取输入数据 int n, na, nb, va, vb; cin >> n >> na >> nb >> va >> vb; vector<int>美味值(n + 1); for (int i = 1; i <= n; ++i) { cin >> 美味值[i]; } // 初始化动态规划数组 vector<vector<int>> dp(na + 1, vector<int>(nb + 1, 0)); // 动态规划填表 for (int i = 0; i <= na; ++i) { for (int j = 0; j <= nb; ++j) { if (i > 0) { dp[i][j] = max(dp[i][j], dp[i - 1][j] + 美味值[i * va + j * vb]); } if (j > 0) { dp[i][j] = max(dp[i][j], dp[i][j - 1] + 美味值[i * va + j * vb]); } } } // 输出结果 cout << dp[na][nb] << endl; return 0; }
代码解释
输入读取:
- 读取
n
,na
,nb
,va
,vb
和美味值数组。
- 读取
动态规划数组初始化:
- 使用二维数组
dp
来存储状态,初始值为 0。
- 使用二维数组
动态规划填表:
- 使用两层循环遍历所有可能的
i
和j
组合。 - 根据状态转移方程更新
dp[i][j]
。
- 使用两层循环遍历所有可能的
输出结果:
- 最终结果存储在
dp[na][nb]
中,输出该值。
- 最终结果存储在
总结
通过上述分析和代码实现,我们可以有效地解决这个问题,帮助熊二计算出最大美味值总和。希望这个解决方案对你有所帮助!
如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑
解决 无用评论 打赏 举报
悬赏问题
- ¥15 centos7系统下abinit安装时make出错
- ¥15 帮看看这个为何无法运行
- ¥15 hbuildex运行微信小程序报错
- ¥50 HAL ADCDMA单次触发转换
- ¥15 关于#python#的问题:我知道这个问题对你们来说肯定so easy
- ¥15 wpf datagrid如何实现多层表头
- ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
- ¥20 网站后台使用极速模式非常的卡
- ¥20 Keil uVision5创建project没反应
- ¥15 mmseqs内存报错