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;
}