POJ 1950 Dessert

举报
Linux猿 发表于 2021/08/05 00:34:08 2021/08/05
【摘要】 题目链接~~ 题意 : 给你 n ( 1 <= n <= 15) 个数(1 . 2 . 3 . 4 ....) 在这些数中间添加 + ,-  ,。,使得最终的计算结果为 0 ,如果情况不大于 20 种 ,则输出全部,否则最多输出 前20 种,按字典序输出。 解题思路 :这题和在广东区域赛的热身赛的一题差不多,深搜枚举所有情况,就是处理点的时候需要注意...

题目链接~~

题意 : 给你 n ( 1 <= n <= 15) 个数(1 . 2 . 3 . 4 ....) 在这些数中间添加 + ,-  ,。,使得最终的计算结果为 0 ,如果情况不大于 20 种 ,则输出全部,否则最多输出 前20 种,按字典序输出。

解题思路 :这题和在广东区域赛的热身赛的一题差不多,深搜枚举所有情况,就是处理点的时候需要注意,同时处理的的情况大于等于 10 的数字应该乘 100 。

代码:


  
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cstdlib>
  6. #include <stack>
  7. #include <queue>
  8. #include <map>
  9. #include <string>
  10. #include <vector>
  11. #include <cmath>
  12. using namespace std ;
  13. const int MX = 100 + 5 ;
  14. const int INF = 0x3f3f3f3f ;
  15. int n ,ans ;
  16. char s[MX] ;
  17. void dfs(int num ,int sum ,int temp ,int pre ,int di) // sum 已经计算的总和
  18. {
  19. if(n == num)
  20. {
  21. if(s[num-1] != '.')
  22. sum += temp*pre ;
  23. else // 大于等于 10 的时候特殊
  24. {
  25. if(num < 10)
  26. sum += (temp*10 + num)*pre ;
  27. else sum += (temp*100 + num)*pre ;
  28. }
  29. if(sum) return ;
  30. ans++ ;
  31. if(ans > 20) return ;
  32. cout<<1 ;
  33. for(int i = 2 ;i <= n ; ++i)
  34. cout<<" "<<s[i-1]<<" "<<i ;
  35. cout<<endl ;
  36. return ;
  37. }
  38. int Temp = temp ;
  39. if(s[num-1] == '.')
  40. {
  41. if(num < 10)
  42. Temp = temp*10 + num ;
  43. else Temp = temp*100 + num ;
  44. }
  45. s[num] = '+' ; // +
  46. dfs(num+1 ,sum + Temp*pre ,num+1 ,1 ,0) ;
  47. s[num] = '-' ; // -
  48. dfs(num+1 ,sum + Temp*pre ,num+1 ,-1 ,0) ;
  49. s[num] = '.' ; // .
  50. if(!di) // 第一次放点
  51. dfs(num+1 ,sum ,num ,pre ,di+1) ;
  52. else
  53. {
  54. if(num < 10) // 注意 >= 10 是需要乘 100
  55. dfs(num+1 ,sum , temp*10 + num ,pre ,di+1) ;
  56. else dfs(num+1 ,sum ,temp*100 + num ,pre ,di+1) ;
  57. }
  58. }
  59. int main()
  60. {
  61. while(~scanf("%d" ,&n))
  62. {
  63. ans = 0 ;
  64. s[0] = '+' ; //
  65. dfs(1 ,0 ,1 ,1 ,0) ; //主要是点的情况特殊
  66. cout<<ans<<endl ;
  67. }
  68. return 0 ;
  69. }




文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/45421705

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。