/*采用DFS,求5个数可否加减乘除运算得到目标数,
否则输出可得到的小于目标数的最大数
//回溯思路是这样的,5个数,先任意找2个数进行加减乘除,把这2个数运算后的结果当做一个数,按相同的方法搜下去
//把4个数任取2个然后合并成3个,再继续搜下去
*/
#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){ //任意去一个两个数进行运算,分别是arr[i]和arr[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) //除数不为0,且能整除时,DFS
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;
}
sicily 1050——5个数通过加减乘除运算得到目标数
最新推荐文章于 2022-12-03 10:42:53 发布