P1874 快速求和
快速求和
题目描述
给定一个数字字符串,用最小次数的加法让字符串等于一个给定的目标数字。每次加法就是在字符串的某个位置插入一个加号。在里面要的所有加号都插入后,就像做普通加法那样来求值。
例如,考虑字符串12
,做 次加法,我们得到数字 。如果插入 个加号,我们得到 ,因此,这个例子中,最少用 次加法就得到数字 。
再举一例,考虑字符串303
和目标数字 ,最佳方法不是3+0+3
。而是3+03
。能这样做是因为一个数的前导 不会改变它的大小。
输入格式
第一行:一个字符串 。
第二行:一个整数 。
输出格式
一行一个整数表示最少的加法次数让 等于 。如果怎么做都不能让 等于 ,则输出 。
样例 #1
样例输入 #1
99999 45
样例输出 #1
4
提示
数据规模与约定
对于 的数据,保证 ,。
解析
这道题的解析好像也没啥可说的,就是爆搜+剪枝就可以过了,读入时将字符转化为数值方便处理,搜索时有两种情况,在该位置加上加号和不加加号,不断向下搜。
代码
#include <bits/stdc++.h> using namespace std; string s; int a[50], res = 0x3f3f3f3f, len, n; void dfs(int step, int ans, int sum, int now) { //step表示当前处理的位数,ans是加号数 //sum是最后一个加号前的总和,now表示还在累加的值(加号还未确定) if (ans > res || sum > n || now > n) return ;//剪枝 if (step > len) { if (sum + now == n) res = ans;//更新答案 return ; } now = 10 * now + a[step]; dfs(step + 1, ans + 1, sum + now, 0);//添一个加号 dfs(step + 1, ans, sum, now);//不添加号 } int main() { cin >> s >> n; len = s.length();//字符串长度 for (int i = 1; i <= len; i ++) a[i] = s[i - 1] - '0';//取出每一位,转成数值 dfs(1, 0, 0, 0);//从第一位开始搜索 if (res >= len) cout << -1 << '\n'; else cout << res << '\n'; return 0; }
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!