sicily1050 Numbers & Letters

题目大意

给出五个数作为因子,通过加减乘除四种运算,是否能得到与目标值相等的值。如果能,则输出目标值。如果不能,则输出与目标值最相近的结果。


解题思路及注意事项:

  1. 采用DFS方法,每次从数组index中取出两个数作四种运算,结果与index其余的数组成一个新的数组,进行递归。
  2. 循环结束条件:目标值与结果相等。或者数组的大小为1。
  3. 注意事项:两个数的减法可以位置互换;除数为0的情况;不能除尽的情况。
  4. 变量类型设为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;
}

        


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值