sicily 1050——5个数通过加减乘除运算得到目标数

/*采用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;
}

		

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值