题目大意
给出五个数作为因子,通过加减乘除四种运算,是否能得到与目标值相等的值。如果能,则输出目标值。如果不能,则输出与目标值最相近的结果。
解题思路及注意事项:
- 采用DFS方法,每次从数组index中取出两个数作四种运算,结果与index其余的数组成一个新的数组,进行递归。
- 循环结束条件:目标值与结果相等。或者数组的大小为1。
- 注意事项:两个数的减法可以位置互换;除数为0的情况;不能除尽的情况。
- 变量类型设为long.
代码如下:
/*采用DFS,求5个数可否加减乘除运算得到目标数,
否则输出可得到的小于目标数的最大数
*/
#include<iostream>
using namespace std;
int flag=0;
long target,result;
long jia(long a, long b){ return a+b;}
long jian(long a, long b){ return a-b;}
long cheng(long a, long b){ return a*b;}
long chu(long a, long b)
{
int temp;
if(a < b){ temp=a; a=b; b=temp;}
if ( b==0 || a%b!=0) return -1;
return a/b;
}
void dfs(long* arr, int n)
{
if(flag == 1) return;
if(arr[0]<=target && result < arr[0]){
result = arr[0];
if(result == target){
flag = 1;
return;
}
}
if(n == 1) return;
int i,j,k,count;
long temp[5];
for(i=0; i<n; i++){
for(j=i+1; j<n; j++){
for(k=0,count=1; k<n; k++){
if(k!=i && k!=j){
temp[count] = arr[k];
count++;
}
}
temp[0] = jia(arr[i], arr[j]);
dfs(temp, n-1);
temp[0] = jian(arr[i], arr[j]);
dfs(temp, n-1);
temp[0] = jian(arr[j], arr[i]);
dfs(temp, n-1);
temp[0] = cheng(arr[i], arr[j]);
dfs(temp, n-1);
temp[0] = chu(arr[i], arr[j]);
if(temp[0] != -1)
dfs(temp, n-1);
}
}
}
int main()
{
int n,i;
long m[5];
cin >> n;
while(n--){
for(i=0; i<5; i++)
cin >> m[i];
cin >> target;
flag=0;
result=-2000000000;
for(i=0; i<5; i++){
if(m[i] <= target && result < m[i])
result = m[i];
}
dfs(m, 5);
cout << result << endl;
}
return 0;
}