本题思路非常明确:在所有能插入加号的位置枚举加号是否存在,对于每一种情况,若求得和为n则更新答案。

但是看看数据规模。。。长度<=40,也就是说枚举的时间最多可达2^39,显然会T,所以需要剪枝。

剪枝1:若整串拆分为单个数字后求和,所得结果>n,则一定无解。

原因:显然在一次拆分后,新生成的数字的和不会比未拆分之前的大(不要问我为什么,这是直觉)。

那么对于某个串,它对应的和最小的拆分方案即为:将其拆分为单个数字。

于是乎,整串对应的最小的和都>n,那么就不可能有可行解了。

剪枝2:若将未处理部分作为一个数字与已处理部分相加,所得的和<n,则在此递归子树中一定无解。

原因:类比一下剪枝1,可得:对于某个串,它对应的和最大的拆分方案为:直接将其转化为数字,即不拆分(不要问我为什么,这也是直觉)。

那么,将未处理部分作为一个数字与已处理部分相加,就是此递归子树中对应和最大的方案。

如果最大的和都<n,那么就不可能有可行解了。

剪枝3:若当前加号数量>=ans,则此递归子树中无更优解。这一点十分显然。

剪枝4:若将未处理部分拆分为单个数字后与已处理部分求和,所得的和>n,则在此递归子树中一定无解。

原因:同剪枝1。

剪枝5:若找到一个可行解,则此递归子树中无更优解。再搜下去,加号会增多,一定得不到比此可行解更优的解。

实现细节及剪枝位置详见代码及注释。

 1 #include<cstdio>
 2 #include<cstring>
 3
 4 using namespace std;
 5
 6 void dfs(int,int,int);
 7 inline int val(int,int);  //将某子串转化为数字
 8 inline int min(int,int);
 9 inline int qh(int,int);  //将某子串拆分为单个数字后求和
10
11 char s[50];
12 int a[50],l,ans=2147483647,sum=0,n;
13
14 int main(){
15     scanf("%s",s+1);
16     scanf("%d",&n);
17     l=strlen(s+1);
18     for(int i=1;i<=l;i++){
19         a[i]=s[i]-'0';
20         sum+=a[i];
21     }
22     if(sum>n){
23         printf("-1\n");  //剪枝1
24         return 0;
25     }
26     else{
27         dfs(0,0,0);
28         if(ans==2147483647)printf("-1\n");
29         else printf("%d\n",ans);
30     }
31
32     return 0;
33 }
34
35 void dfs(int res,int p,int dep){  //res:已处理部分的和 p:标记已经处理到何处 dep:加号数量
36     int temp=res+val(p+1,l);  //将未处理部分作为一个数字与已处理部分相加
37     if(temp<n)return;  //剪枝2
38     if(dep>=ans)return;  //剪枝3
39     if(res+qh(p+1,l)>n)return;  //剪枝4
40     if(temp==n){  //找到可行解
41         ans=min(ans,dep);  //更新答案
42         return;  //剪枝5
43     }
44     for(int i=p+1;i<l;i++){
45         temp=res+val(p+1,i);
46         dfs(temp,i,dep+1);
47     }
48 }
49
50 inline int val(int l,int r){
51     int ans=0;
52     for(int i=l;i<=r;i++)ans=(ans<<3)+(ans<<1)+a[i];
53     return ans;
54 }
55
56 inline int min(int x,int y){
57     if(x<y)return x;else return y;
58 }
59
60 inline int qh(int l,int r){
61     int ans=0;
62     for(int i=l;i<=r;i++)ans+=a[i];
63     return ans;
64 }

转载于:https://www.cnblogs.com/running-coder-wfh/p/11163527.html

洛谷T1874 快速求和相关推荐

  1. 洛谷——P2415 集合求和

    P2415 集合求和 题目描述 给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和. 输入格式 集合中的元素(元素<=1000) 输出格式 和 输入输出样例 输入 #1复制 ...

  2. 洛谷 B2059 奇数求和

    奇数求和 题目描述 计算非负整数 mmm 到 nnn(包括 mmm 和 nnn)之间的所有奇数的和,其中,mmm 不大于 nnn,且 nnn 不大于 300300300.例如 m=3,n=12,m=3 ...

  3. 洛谷 P2415 集合求和【数学公式/模拟】

    给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和. 输入输出格式 输入格式: 集合中的元素(元素<=1000) 输出格式: 和 输入输出样例 输入样例#1: 2 3 输出 ...

  4. 洛谷1226快速幂模板

    题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^p mod k=s" ...

  5. 洛谷 深基 第1部分 语言入门 第7章 函数与结构体

    P5735 [深基7.例1]距离函数 [深基7.例1]距离函数 - 洛谷 P5735 [深基7.例1]距离函数(python3实现) P5735 [深基7.例1]距离函数(python3实现)_青少年 ...

  6. 算法刷题【洛谷P1593】因子和(附等比数列求和公式推导)

    异想之旅:本人原创博客完全手敲,绝对非搬运,全网不可能有重复:本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告.本人所有文章仅在CSDN.掘金和个人博客(一定是异想之旅域名)发布,除此之外全部是 ...

  7. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  8. 洛谷 1226 取余运算||快速幂

    洛谷  取余运算||快速幂 1226 其实比起楼下的大佬们,我主要是多了些位运算和讲解. 想法一: 直接输出 pow(b,q)%k 嗯~~勇气可嘉,但是看一眼数据范围(长整型)就会意识到,这个方法也许 ...

  9. 快速幂||取余运算【模板】(洛谷P1226题题解,Java语言描述)

    题目要求 P1226题目链接 分析 标准的快速幂取模算法板子,之前这个算法我在这篇文章中讲过了:<快速幂算法详解&&快速幂取模算法详解>. 这里选择使用比较简单的API实现 ...

最新文章

  1. R语言使用ggpubr包的ggarrange函数组合多张结论图:使用ggpubr包在散点图的侧面添加辅助图形、并使用NULL将不需要可视化的侧面留白
  2. 时间罗盘html源代码_重磅!Vue 3.0源代码公布后,究竟有哪些变更?
  3. 项目:IT资源共享资源(登录前端)1
  4. ASP.NET的票据工具类FormsAuthenticationTicket
  5. android学习笔记33——资源ShapeDrawable
  6. 一个故事讲清楚 NIO
  7. Linux 配置JAVA_HOME
  8. kali linux fuzz工具集简述
  9. chrom浏览器-F2使用方法一
  10. 网站前端设计,从960框架开始
  11. android访问重定向地址,如何从android中重定向url加载图像(示例代码)
  12. JS的条形码和二维码生成
  13. laravel5.4根据数据表生成迁移文件
  14. 自动化测试之Appium模拟机测试
  15. 1008. 数组元素循环右移问题 (20)-PAT乙级真题
  16. 【免费毕设】ASP.NET通用作业批改系统设计(源代码+lunwen)
  17. 阶段3 3.SpringMVC·_06.异常处理及拦截器_6 SpringMVC拦截器之拦截器入门代码
  18. 基础实验——与V831串口通讯
  19. ps画画模糊笔刷_用ps污点画笔修复工具讲图片变成朦胧效果
  20. 美元指数展现王者风范 国际黄金重返下跌通道

热门文章

  1. HTTP 错误 500.22 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置。...
  2. 算法6-1:哈希函数
  3. Oracle CheckPoint进程
  4. flink 异步io使用
  5. Bad level value for property: .level
  6. Exception in thread “main“ java.lang.NoClassDefFoundError: javax/script/Compilable
  7. Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
  8. celery异步邮件发送系统出现django.core.exceptions.ImproperlyConfigured: Requested setting EMAIL_FROM
  9. ubuntu+ngrok内网穿透+Flask部署以及frp稍微提一下
  10. kaggle删除自己的数据集