求一个数组中仅用加法得到指定值
int getsum(std::vector<int> v)
{
vector<int>::iterator it = v.begin();
int sum = 0;
for (; it != v.end(); it++)
sum += *it;
return sum;
}
void print(vector<int> v)
{
vector<int>::iterator it = v.begin();
for (; it != v.end(); it++)
cout << *it << ' ';
cout << endl;
}
void sumCombine(std::vector<int> v, int start, int valSum,vector<int> sum)
{
if (getsum(sum) == valSum)
{
print(sum);
return;
}
for (int i = start; i < v.size(); i++)
{
sum.push_back(v.at(i));
sumCombine(v, i + 1, valSum,sum);
sum.pop_back();
}
}
分析:1.选择元素i,从剩下的n-1元素中选择组合为sum-i的元素
2.不选择元素i,从剩下的n-1个元素中选择组合为sum的元素
此时的操作是+a+b+c
仅用加法和减法求数组中的元素组合为指定值
void sumCombine(std::vector<int> v, int start, int valSum,vector<int> sum)
{
if (getsum(sum) == valSum)
{
print(sum);
return;
}
for (int i = start; i < v.size(); i++)
{
sum.push_back(v.at(i));
sumCombine(v, i + 1, valSum,sum);
sum.pop_back();
sum.push_back(-v.at(i));
sumCombine(v, i + 1, valSum,sum);
sum.pop_back();
}
}
分析:因为多了减法,所以一个元素x,可以扮演两种角色
1.x作为加法放入
2.x作为减法放入
此时的操作是+a-b+c的操作
加减乘除组合 得到指定值
分析:此时的操作是 a op b 其中a,b为两个不同的操作数,op为+ - * /中的一种
#define MAX 1000
int getsum(vector<double> svec, vector<char> ssig)
{
vector<double> vec = svec;
vector<char> signal = ssig;
while (!signal.empty() && !vec.empty())
{
char s = signal.back();
signal.pop_back();
double a = vec.back();
vec.pop_back();
double b = vec.back();
vec.pop_back();
double c = 0;
switch (s)
{
case '*':
c = a*b;
vec.push_back(c);
break;
case '/':
c = (double)a/b;
if (c - (int)c != 0)
return MAX;
vec.push_back(c);
break;
case '-':
c = a-b;
vec.push_back(c);
break;
case '+':
c = a+b;
vec.push_back(c);
break;
default:
break;
}
}
if (!vec.empty())
return vec.back();
else
return MAX;
}
void print(vector<double> vec, vector<char> signal)
{
while (!signal.empty() && !vec.empty())
{
double a = vec.back();
vec.pop_back();
cout << a << ' ';
char s = signal.back();
signal.pop_back();
cout << s << ' ';
}
cout << vec.back()<<endl;
}
void CombineAcl(vector<double> input, int start, vector<double> &output, vector<char> &signal, int m)
{
if (m == getsum(output, signal))
{
print(output, signal);
return;
}
for (int i = start; i < input.size(); i++)
{
output.push_back(input.at(i));
for (int j = i + 1; j < input.size(); j++)
{
output.push_back(input.at(j));
signal.push_back('*');
CombineAcl(input, j + 1, output, signal, m);
signal.pop_back();
signal.push_back('+');
CombineAcl(input, j + 1, output, signal, m);
signal.pop_back();
signal.push_back('-');
CombineAcl(input, j + 1, output, signal, m);
signal.pop_back();
signal.push_back('/');
CombineAcl(input, j + 1, output, signal, m);
signal.pop_back();
output.pop_back();
}
output.pop_back();
}
}
注意:
有时结果会有重复,一般只有一个,比如{1,2,3,4,5,6,7} 求给定值6
如果输出为7-4*3 其计算顺序实际是(7-4)*3