题意:

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网

小红正在研究如何把符卡组合出尽可能大威力的组合魔法。

小红共有 n 种符卡可以选择,每种符卡最多只能选择一次,每个符卡的魔力消耗为 ai​,威力为 bi。
如果将多个符卡进行组合,则可以发动一个组合魔法。组合魔法的魔力消耗为选择的符卡的魔力消耗的总和,其威力为选择的符卡的威力的总和。
小红必须保证最终符卡的魔力消耗总和为 k 的倍数,否则小红将受到魔力反噬而发动魔法失败。
小红想知道,自己能发动的组合魔法最大的威力是多少?

输入描述:


第一行输入两个正整数 n 和 k ,用空格隔开。

接下来的 n行,每行输入两个正整数 ai​ 和 bi​,用空格隔开。
数据范围:
1≤n,k≤1000
1≤ai​,bi​≤10^9

输出描述:

如果小红无论如何也组合不了能发动的魔法,则输出-1。
否则输出最大的威力值。

思路:这道题是一个01背包的变形,但要注意初始化的细节,自己再做题时由于初始化的细节没有考虑周全,导致一直过不了题,看了大部分题解是把dp数组初始化为负无穷,这样dp方程很容易给出,我初始化为0导致需要特判某些情况,下次要注意对于01背包初始化为负无穷。

我的代码段

#include<bits/stdc++.h>
using namespace std;
int main(){long long dp[1010][1010],a[1010],b[1010];long long n,k;cin>>n>>k;memset(dp,0,sizeof dp);//初始化dp数组为0for(int i=1;i<=n;i++)cin>>a[i]>>b[i],a[i]%=k;//将a[i]取模for(int i=1;i<=n;i++){for(int j=0;j<k;j++){if(dp[i-1][(j-a[i]+k)%k]==0&&j==a[i])dp[i][j]=max(dp[i-1][j],b[i]);//如果他的前一个为0代表没有途径到达那里,此时只需要判断不选他或者只选他的大小else if(dp[i-1][(j-a[i]+k)%k]!=0){dp[i][j]=max(dp[i-1][j],dp[i-1][(j-a[i]+k)%k]+b[i]);}//正常的dp方程,如果他前一个不为0则有途径到达,直接取选或者不选的最大值。else if(dp[i-1][(j-a[i]+k)%k]==0)dp[i][j]=dp[i-1][j];//其他情况下(即没有途径到达且j也不等于a[i])都是不选。}}if(dp[n][0]==0)cout<<"-1"<<endl;else cout<<dp[n][0]<<endl;
}

题解给出的答案

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[1010][2],dp[1010][1010];
int main(){int n,k,i,j;cin>>n>>k;for(i=1;i<=n;i++)cin>>a[i][0]>>a[i][1];for(i=0;i<=n;i++)for(j=0;j<=k;j++)dp[i][j]=-1e16;//注意这里的初始化一定要尽可能小!代表是取不到的。dp[0][0]=0;//前0件物品,显然取到的最大威力为0。此时消耗魔力模p等于0for(i=1;i<=n;i++){for(j=0;j<k;j++){dp[i][j]=dp[i-1][j];//这一部分是不取第i个符卡。dp[i][j]=max(dp[i][j],dp[i-1][(j-a[i][0]%k+k)%k]+a[i][1]);//这一部分是取第i个符卡,那么目前的威力如果模k为j的话,一定是从“前i-1个符卡,威力模k为j-a[i]转移而来”}}if(dp[n][0]<=0)cout<<-1;else cout<<dp[n][0];
}

牛客寒假训练营4-爆炸的符卡洋洋洒洒 (dp变形)相关推荐

  1. 爆炸的符卡洋洋洒洒题解报告

    爆炸的符卡洋洋洒洒题解报告 标签:动态规划 题目链接 来源:牛客网 解题思路: 显而易见的背包问题 但再观察a,b的数据范围,开不了那么大的dp数组 这就启发我们去优化,由于题目要求魔力总耗的是k的倍 ...

  2. 2023牛客寒假算法基础集训营1_20230116「典dp」「典set」「小思维+bfs」「小思维+构造+码力」「位运算博弈(人类智慧)」

    6/13 打得不好,这两天家里也很不好,跟做梦一样,脑子好像被僵尸吃掉了,前两个小时胡乱瞎写交题只过样例,wa了再看,什么b错都能写出来. M. M-本题主要考察了找规律_2023牛客寒假算法基础集训 ...

  3. 爆炸的符卡洋洋洒洒(dp)

    题目链接:I-爆炸的符卡洋洋洒洒_2022牛客寒假算法基础集训营4 (nowcoder.com) 题目:小红正在研究如何把符卡组合出尽可能大威力的组合魔法.小红共有 n 种符卡可以选择,每种符卡最多只 ...

  4. 牛客寒假算法基础集训营4-I.爆炸的符卡洋洋洒洒

    标签:动态规划 思路 本题比较容易看出来是01背包的变形 注意到a的数据范围很大,dp数组是肯定存不下的,但是k的范围很小,而本题中要求魔力消耗总和是k的倍数,这就意味着如果a[i]%k==t,那么a ...

  5. I 爆炸的符卡洋洋洒洒(牛客)01背包

    输入 2 2 1 2 2 1 输出 1 说明 选择第二个符卡,消耗为2,是2的倍数.威力是1. 输入 2 2 1 2 2 1 输出 1 说明 选择第二个符卡,消耗为2,是2的倍数.威力是1. 输入 3 ...

  6. I—爆炸的符卡洋洋洒洒(不模不行的DP)

    题目如下: 链接:登录-专业IT笔试面试备考平台_牛客网 来源:牛客网 小红正在研究如何把符卡组合出尽可能大威力的组合魔法. 小红共有 n 种符卡可以选择,每种符卡最多只能选择一次,每个符卡的魔力消耗 ...

  7. 爆炸的符卡洋洋洒洒<每日一题>(01背包变种)

    题目: 题目链接:登录-专业IT笔试面试备考平台_牛客网 思路: 该题为01背包的变种问题 我们先来复习一下普通的01背包 dp[i][j]数组的含义: i代表了取前i个物品 j代表了背包的空间 数组 ...

  8. 爆炸的符卡洋洋洒洒(01背包)

    题目链接 https://ac.nowcoder.com/acm/contest/23479/I 题面 思路 我们从这n种符卡中选择一些卡牌,然后每张卡牌花费aia_iai​的魔力,达到bib_ibi ...

  9. 爆炸的符卡洋洋洒洒题解

    题目描述 小红正在研究如何把符卡组合出尽可能大威力的组合魔法. 小红共有 n种符卡可以选择,每种符卡最多只能选择一次,每个符卡的魔力消耗为 ai​,威力为 bi​. 如果将多个符卡进行组合,则可以发动 ...

最新文章

  1. 小红帽怎样装图形化界面_linux安装图形化界面
  2. html5添加随机率,HTML5 canvas  绘制随机曲线 并实现放大功能
  3. ubuntu ssh是否安装mysql_ubuntu的安装及ubuntu中安装mysql和tomcat
  4. optfine的jar文件打不开_JAVA版1.14.4 装了最新版的optifine游戏打不开了 求助大佬们...
  5. linux 修改默认脚本,linux环境初始脚本
  6. 公钥和私钥 java_公钥与私钥 - yxhxj2006 - BlogJava
  7. java webview 对象_Android – 将JSON对象从webview javascript传递给java
  8. 嵌入式开发之视频压缩比---h264、mjpeg、mpeg4
  9. 简易局域网聊天java_简单的局域网聊天程序(java版本的)
  10. android怎实现拼图功能,基于Android的趣味拼图的实现
  11. win10 屏幕保护程序“在恢复时显示登录屏幕”灰色
  12. 专业CDR插件牛为设计大师
  13. 好看的滚动条样式,css实现好看的滚动条样式
  14. Windows 8.1下释放磁盘空间的指南
  15. 使用rufus制作Windows Server 2008 U盘_wentfar·tsao
  16. 3dsMAX中R键的用法
  17. 仿电池电量充电、上下左右剪切动画
  18. Cadence Allegro调整丝印技巧-先自动调整再手动微调图文教程及视频演示
  19. 计算机是我们生活中必需的工具英语,作业英语单词
  20. 计算机毕业设计(附源码)python信用卡逾期数据处理分析系统

热门文章

  1. 量子计算机算法与应用研究论文(转载务必注明出处)
  2. [编程题] 字符迷阵
  3. 计算机科学导论第五版第二章答案,计算机科学导论样题1答案
  4. 英语学习详细笔记(十五)被动语态
  5. Android Clipping
  6. 解决微信小程序自定义tabbar跳转页面图标闪动问题
  7. 用 Java 实现坦克大战,这个有点强了!
  8. [CODE【VS】]江哥的DP题d
  9. xp系统打印机服务器win7连接不了,xp不能访问win7共享打印机
  10. 布林带止盈止损策略改进