药水的规则:傲傲总共可以喝下m瓶魔法药水,并且使用时,同一种魔法药水最多连续喝下k瓶。如果超过了这些限制,就会适得其反!
因此小傲想知道,按照这样的规则喝下魔法药水,最多可以增长多大的重量呢?
输入格式
第一行,输入三个整数n、m、k表示傲傲得到了n种魔法药水,最多喝下m瓶,每种药水最多连续喝下k瓶。
第二行,输入n个整数w 1,w 2.......w n,第ii个数表示第ii种药水能使傲傲增加的重量为w i
输出格式
一个整数,输出最多可以增长的重量。
输入数据 1
6 3 2
1 3 3 7 4 2
输出数据 1
18
输入数据 2
3 1000000000 1
1000000000 987654321 1000000000
输出数据 2
1000000000000000000
c++喝魔法药水问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
4条回答 默认 最新
关注 【以下回答由 GPT 生成】
首先,我们需要读取输入的数据并进行相应的处理。然后,我们可以使用动态规划的方法来解决这个问题。
首先,我们可以定义一个二维数组dp,其中dp[i][j]表示使用前i种药水,喝掉了j瓶药水时,傲傲能增长的最大重量。由于我们只需要储存前一个状态的值,所以我们可以使用两个一维数组进行状态转移。
接下来,我们可以使用一个循环来遍历每种魔法药水,并在其中再进行一个循环来遍历可以喝下的药水瓶数。在内层循环中,我们可以利用状态转移方程来更新dp数组的值。对于第i种药水,我们可以分两种情况考虑:
-
当前喝的药水数小于等于k时,我们可以选择喝这瓶药水,也可以选择不喝这瓶药水。如果选择喝这瓶药水,则增长的重量为dp[i-1][j-1] + wi,其中dp[i-1][j-1]表示前i-1种药水喝了j-1瓶的最大重量。如果选择不喝这瓶药水,则增长的重量为dp[i-1][j],表示前i-1种药水喝了j瓶的最大重量。所以,我们可以取这两种情况中的较大值。
-
当前喝的药水数大于k时,我们只能选择不喝这瓶药水,增长的重量为dp[i-1][j]。
最后,我们可以返回dp[n][m]的值,即使用了n种药水,喝掉了m瓶药水时,傲傲能增长的最大重量。
下面是具体的代码实现:
#include <iostream> #include <vector> using namespace std; int main() { int n, m, k; cin >> n >> m >> k; vector<int> w(n); for (int i = 0; i < n; i++) { cin >> w[i]; } vector<vector<long long>> dp(n + 1, vector<long long>(m + 1, 0)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { for (int x = 0; x <= min(j, k); x++) { dp[i][j] = max(dp[i][j], dp[i - 1][j - x] + w[i - 1] * x); } } } cout << dp[n][m] << endl; return 0; }
这样,我们就可以解决该问题了。
【相关推荐】
- 你可以看下这个问题的回答https://ask.csdn.net/questions/7792056
- 这篇博客你也可以参考下:c++信奥之路【接水问题】
- 除此之外, 这篇博客: C++算法:接雨水中的 题目: 部分也许能够解决你的问题。
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报-
悬赏问题
- ¥100 用数字代替ip主机号断与旋转链接号段
- ¥20 学校内手机热点不能使用
- ¥15 qwen模型微调训练时grad_norm为0.0或为nan
- ¥15 若依- Spring cloud-plus集成阿里云schedulerX再控制台应用管理找不到实例
- ¥15 用vs2022 fortran调试只无法查看数组的值,显示发生未指定的错误
- ¥15 gge梦幻西游的地图制作
- ¥15 对计算机的学习没有方向
- ¥15 用VBA抓取淘宝的发票号码和下载发票pdf遇到的问题
- ¥20 java excel导出有什么解决方案
- ¥15 关于#r语言#的问题:并不是原CSV文件中的数据