牛客寒假训练营4-爆炸的符卡洋洋洒洒 (dp变形)
题意:
链接:登录—专业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变形)相关推荐
- 爆炸的符卡洋洋洒洒题解报告
爆炸的符卡洋洋洒洒题解报告 标签:动态规划 题目链接 来源:牛客网 解题思路: 显而易见的背包问题 但再观察a,b的数据范围,开不了那么大的dp数组 这就启发我们去优化,由于题目要求魔力总耗的是k的倍 ...
- 2023牛客寒假算法基础集训营1_20230116「典dp」「典set」「小思维+bfs」「小思维+构造+码力」「位运算博弈(人类智慧)」
6/13 打得不好,这两天家里也很不好,跟做梦一样,脑子好像被僵尸吃掉了,前两个小时胡乱瞎写交题只过样例,wa了再看,什么b错都能写出来. M. M-本题主要考察了找规律_2023牛客寒假算法基础集训 ...
- 爆炸的符卡洋洋洒洒(dp)
题目链接:I-爆炸的符卡洋洋洒洒_2022牛客寒假算法基础集训营4 (nowcoder.com) 题目:小红正在研究如何把符卡组合出尽可能大威力的组合魔法.小红共有 n 种符卡可以选择,每种符卡最多只 ...
- 牛客寒假算法基础集训营4-I.爆炸的符卡洋洋洒洒
标签:动态规划 思路 本题比较容易看出来是01背包的变形 注意到a的数据范围很大,dp数组是肯定存不下的,但是k的范围很小,而本题中要求魔力消耗总和是k的倍数,这就意味着如果a[i]%k==t,那么a ...
- I 爆炸的符卡洋洋洒洒(牛客)01背包
输入 2 2 1 2 2 1 输出 1 说明 选择第二个符卡,消耗为2,是2的倍数.威力是1. 输入 2 2 1 2 2 1 输出 1 说明 选择第二个符卡,消耗为2,是2的倍数.威力是1. 输入 3 ...
- I—爆炸的符卡洋洋洒洒(不模不行的DP)
题目如下: 链接:登录-专业IT笔试面试备考平台_牛客网 来源:牛客网 小红正在研究如何把符卡组合出尽可能大威力的组合魔法. 小红共有 n 种符卡可以选择,每种符卡最多只能选择一次,每个符卡的魔力消耗 ...
- 爆炸的符卡洋洋洒洒<每日一题>(01背包变种)
题目: 题目链接:登录-专业IT笔试面试备考平台_牛客网 思路: 该题为01背包的变种问题 我们先来复习一下普通的01背包 dp[i][j]数组的含义: i代表了取前i个物品 j代表了背包的空间 数组 ...
- 爆炸的符卡洋洋洒洒(01背包)
题目链接 https://ac.nowcoder.com/acm/contest/23479/I 题面 思路 我们从这n种符卡中选择一些卡牌,然后每张卡牌花费aia_iai的魔力,达到bib_ibi ...
- 爆炸的符卡洋洋洒洒题解
题目描述 小红正在研究如何把符卡组合出尽可能大威力的组合魔法. 小红共有 n种符卡可以选择,每种符卡最多只能选择一次,每个符卡的魔力消耗为 ai,威力为 bi. 如果将多个符卡进行组合,则可以发动 ...
最新文章
- 小红帽怎样装图形化界面_linux安装图形化界面
- html5添加随机率,HTML5 canvas 绘制随机曲线 并实现放大功能
- ubuntu ssh是否安装mysql_ubuntu的安装及ubuntu中安装mysql和tomcat
- optfine的jar文件打不开_JAVA版1.14.4 装了最新版的optifine游戏打不开了 求助大佬们...
- linux 修改默认脚本,linux环境初始脚本
- 公钥和私钥 java_公钥与私钥 - yxhxj2006 - BlogJava
- java webview 对象_Android – 将JSON对象从webview javascript传递给java
- 嵌入式开发之视频压缩比---h264、mjpeg、mpeg4
- 简易局域网聊天java_简单的局域网聊天程序(java版本的)
- android怎实现拼图功能,基于Android的趣味拼图的实现
- win10 屏幕保护程序“在恢复时显示登录屏幕”灰色
- 专业CDR插件牛为设计大师
- 好看的滚动条样式,css实现好看的滚动条样式
- Windows 8.1下释放磁盘空间的指南
- 使用rufus制作Windows Server 2008 U盘_wentfar·tsao
- 3dsMAX中R键的用法
- 仿电池电量充电、上下左右剪切动画
- Cadence Allegro调整丝印技巧-先自动调整再手动微调图文教程及视频演示
- 计算机是我们生活中必需的工具英语,作业英语单词
- 计算机毕业设计(附源码)python信用卡逾期数据处理分析系统