2020/4/8 招商银行第二道编程题——回溯法

先输入行数row,再输入row行“数字+目标”。问,如果在数字之间可以添上加减号,那么使得数字运算后等于目标的添法有几种?

如输入:
2
21 1
12345 3

输出:
1
1


回溯法可以解决。
坑的是,楼主没想到题目的意思是只能在数字之间加符号,而楼主提交的代码是考虑到第一个数字之前可能加负号的,遗憾没AC,考试结束自己改了一行代码,就没问题了。
下面是正确的代码,供大家参考下,水平有限,希望吧友指出我的不足。

#include<queue>
#include<vector>
#include<iostream>
#include<stdio.h>
#include<numeric>
#include<algorithm>
#include<set>
#include<map>
#include<unordered_set>
#include<unordered_map>
#include<functional>
#include<iterator>
#include<sstream>
#include<string>
#include <math.h>
using namespace std;


void DFS(vector<int> nums, int loc, int value, int goal, int& count) {
	if (loc == nums.size() && value == goal) {
		++count;
		return;
	}
	for (int i = 0; i < 2 && loc < nums.size(); ++i) {
		if (i == 0) {
			value += nums[loc];
			DFS(nums, loc + 1, value, goal, count);
			value -= nums[loc];
		}
		if (i == 1) {
			value -= nums[loc];
			DFS(nums, loc + 1, value, goal, count);
			value += nums[loc];
		}
	}
}

int main() {
	int row;
	cin >> row;
	vector<string> strs;
	vector<int> goals;
	string tmp;
	getline(cin, tmp);
	for (int i = 0; i < row; ++i) {
		string str;
		getline(cin, str);
		stringstream ss(str);
		string a, b;
		ss >> a >> b;
		strs.push_back(a);
		goals.push_back(atoi(b.c_str()));
	}
	vector<vector<int> > figures;
	for (auto str : strs) {
		vector<int> a_row;
		for (int i = 0; i < str.size(); ++i) {
			a_row.push_back(str[i] - '0');
		}
		figures.push_back(a_row);
	}
	for (int i = 0; i < figures.size(); ++i) {
		int count = 0;
		vector<int> nums(figures[i].begin() + 1, figures[i].end());
		DFS(nums, 0, figures[i][0], goals[i], count);
		cout << count << endl;
	}
	return 0;
}




#招商银行信用卡中心2020春招##招商银行#
全部评论
private static int dfs(final String str, final int len, final long sum) {         if (len == 1) {             return sum - Long.valueOf(str.substring(0)) == 0 ? 1 : 0;         }         final long val = Long.valueOf(str.substring(len - 1));         final int noRes = dfs(str, len - 1, sum);         final int addRes = dfs(str.substring(0, len - 1), len - 1, sum - val);         final int minusRes = dfs(str.substring(0, len - 1), len - 1, sum + val);         return addRes + minusRes + noRes;     }
1 回复 分享
发布于 2020-04-09 15:02
   List<List<Integer>> lists = new ArrayList<>();     private int sumCounts(String t, int k) {         List<Integer> sublist = new ArrayList<>();         dfs(t, k, 0, sublist);         return lists.size();     }     private void dfs(String t, int k, int start, List<Integer> sublist) {         int sum = 0;         for (int i = 0; i < sublist.size(); i++) {             if (sublist.get(0)<0)return;             sum += sublist.get(i);         }         if (sum == k && start == t.length()) {             lists.add(new ArrayList(sublist));             return;         }         if (sublist.size() == t.length()) return;         for (int i = start; i < t.length(); i++) {             int i1 = Integer.parseInt(t.substring(start, i + 1));             sublist.add(i1);             dfs(t, k, i + 1, sublist);             sublist.remove(sublist.size() - 1);             sublist.add(-i1);             dfs(t, k, i + 1, sublist);             sublist.remove(sublist.size() - 1);         }
1 回复 分享
发布于 2020-04-09 13:27
这题第一位数字前面是不加符号的
1 回复 分享
发布于 2020-04-08 21:37
C++的格式化输入总是折磨的我头疼,能像python一样简洁就好了
1 回复 分享
发布于 2020-04-08 21:30
题主是不是没考虑第三种情况啊,数字中间没有+-符号的情况。
点赞 回复 分享
发布于 2020-04-09 10:48
这个题不可以用两位嘛。。就是12-3+4-5这种
点赞 回复 分享
发布于 2020-04-08 21:30

相关推荐

不愿透露姓名的神秘牛友
05-20 16:14
已编辑
不止遇到一次了,什么都不会,让提合并请求,问什么是合并请求。让gitlab.页面把测试截图附上,不知道截图要放在哪,那么大的编辑看不到吗让配开发机,问ip是什么东西……这都咋进来的啊,我们(我2023年毕业)那会儿没AI的时候面试都是直接linux,docker,k8s,git,结构与算法,计网。怎么才过去2年,实习生跟傻子一样,有些问题问的我难受,不会git&nbsp;commit,不会git&nbsp;pull,不会切换分支,直接要覆盖master....————而且态度非常敷衍,3天前给开个仓库权限,连本地都没有拉下来。让写一个小文档,都是说一句,写一句,说把目录加上,挺嗤之以鼻,最后还是把目录加上了😂😂任何文档和注释都是方便后来人的,现在的人真的很自负啊,打开github看看任何一个开源项目的文档和注释,都写的很详细。难道现在的同学在校期间不经常拉开源项目看源码学习吗?&nbsp;哪怕是一个swap函数,开源项目里都经常注释:1&nbsp;3&nbsp;5&nbsp;7&nbsp;9&nbsp;2&nbsp;4&nbsp;6&nbsp;8&nbsp;10^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rswap:{功能描述}{使用样例}————给我气笑了,没次问我有什么任务的时候,我都是说,优先你学校导师的项目,然后再做公司需求。然后给了两个需求,一个月内搞定就行,既然是agent开发,1.&nbsp;部署需要维护项目的开发环境2.阅读opencode/openclaude代码(我个人感觉龙虾的源码agent部分很常规,就一个channel+agent,还不如看claude泄露的代码和opencode)然后任务1搞了几周说因为环境问题,他申请到的远程开发机是linux,装的python2,项目是py3的,所以没搭建,我说你不行就用conda或docker把环境屏蔽了呢,没搭理我。任务2:看了很长时间代码,给我回了一句,opencode和openclaude是用go写的……我说你打开github看右下角那的语言是ts还是go……&nbsp;结果满脸懵的说ts是什么……我让看agent&nbsp;loop,哪怕全局搜索一下while(true),跳过去从头看到尾就大致清楚了,压根没看。————嘻嘻,我已经开始做社招简历了。
redf1sh:默认会git结果发现真不会,这种一看就是没做过项目的,真做过项目的至少会提交
点赞 评论 收藏
分享
评论
2
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务