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春招##招商银行#
全部评论
C++的格式化输入总是折磨的我头疼,能像python一样简洁就好了
1 回复 分享
发布于 2020-04-08 21:30
这题第一位数字前面是不加符号的
1 回复 分享
发布于 2020-04-08 21:37
   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
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
这个题不可以用两位嘛。。就是12-3+4-5这种
点赞 回复 分享
发布于 2020-04-08 21:30
题主是不是没考虑第三种情况啊,数字中间没有+-符号的情况。
点赞 回复 分享
发布于 2020-04-09 10:48

相关推荐

2024-11-19 23:36
未填写教育信息 Java
废铁汽车人:秋招真是牛鬼蛇神齐聚一堂
点赞 评论 收藏
分享
评论
2
8
分享

创作者周榜

更多
牛客网
牛客企业服务