题目大意:
给出5个数和一个目标数,从5个数中选出一部分数通过加减乘除运算得到小于等于目标数的最大数。
策略:用深度优先搜索求得所有组合
#include <iostream>
#define N 5
using namespace std;
int result;
int target;
bool flag;
int my_add(int a,int b)
{
return a + b;
}
int my_sub(int a,int b)
{
return a - b;
}
int my_mul(int a,int b)
{
return a * b;
}
int my_div(int a,int b)
{
if(a < b)
{
int temp =a;
a = b;
b = temp;
}
if(b == 0 || a % b != 0)
return -1;
return a / b;
}
void dfs(int arry[],int length)
{
if(flag == true)
return;
if(arry[0] > result && arry[0] <= target)
{
result = arry[0];
if(arry[0] == target)
{
//result = arry[0];
flag = true;
return;
}
}
if(length == 0)
return;
int temp[N];
for(int i = 0; i < length;i++)
for(int j = i + 1;j < length;j++)
{
for(int k = 0,l = 1;k < length;k++)
{
if(k != i && k != j)
{
temp[l] = arry[k];
l++;
}
}
temp[0] = my_add(arry[i],arry[j]);dfs(temp,length - 1);
temp[0] = my_sub(arry[i],arry[j]);dfs(temp,length - 1);
temp[0] = - temp[0];dfs(temp,length - 1);
temp[0] = my_mul(arry[i],arry[j]);dfs(temp,length - 1);
temp[0] = my_div(arry[i],arry[j]);
if(temp[0] != -1)
dfs(temp,length - 1);
}
}
int main()
{
int n;
cin >> n;
while(n--)
{
int arry[N];
for(int i = 0;i < N;i++)
cin >> arry[i];
cin >> target;
//先找出数组中与目标最接近的数
result = -2000000000;
for(int i = 0;i < N;i++)
{
if(arry[i] > result && arry[i] <= target)
result = arry[i];
}
flag = false;
dfs(arry,N);
cout << result << endl;
}
return 0;
}