Algorithm 如何使用+或-运算从数字列表中获取数字

Algorithm 如何使用+或-运算从数字列表中获取数字,algorithm,binary,numbers,Algorithm,Binary,Numbers,在我的问题中,我们得到了一个数字和一系列数字,我们应该使用+或- 例如: -1是目标号码 1 2 3 5是为得到-1而给出的数字 解决方案应为-1+2+3-5=-1 或-1-2-3+5=-1 目标编号的限制范围为-180到+180,编号列表的限制范围为2到20 要找到解决方案,应该使用什么样的算法?如果我想使用生成所有的可能性,它会有效吗?这个问题有二进制解吗 感谢您的帮助可能的变体数量为2^20;让我们生成从0到2^N的所有数字。这些数字的二进制表示形式将是0000020零,000…01000

在我的问题中,我们得到了一个数字和一系列数字,我们应该使用+或-

例如: -1是目标号码 1 2 3 5是为得到-1而给出的数字 解决方案应为-1+2+3-5=-1 或-1-2-3+5=-1

目标编号的限制范围为-180到+180,编号列表的限制范围为2到20

要找到解决方案,应该使用什么样的算法?如果我想使用生成所有的可能性,它会有效吗?这个问题有二进制解吗


感谢您的帮助

可能的变体数量为2^20;让我们生成从0到2^N的所有数字。这些数字的二进制表示形式将是0000020零,000…010000.10,…,111120个一。想象一下,每一个零都是负的,一个是正的

    int target = -1;
    int[] numbers = new int[20];
    Arrays.fill(numbers, 0);

    numbers[0] = 1;
    numbers[1] = 2;
    numbers[2] = 3;
    numbers[3] = 5;
    for(int i=0;i<(1<<20);i++) //masks from 00...00 to 11...11 (from --...--- to ++...+++)
    {
        int sum=0;
        for(int bit=0;bit<20;bit++)
        {
            if(((1<<bit)&i)>0)
            {
                sum+=numbers[bit];
            }
            else
            {
                sum-=numbers[bit];
            }
        }
        if(sum==target)
        {
            System.out.print(target+" = ");
            for(int bit=0;bit<20;bit++)
            {
            if(((1<<bit)&i)>0)
            {
                System.out.print("+"+numbers[bit]);
            }
            else
            {
                System.out.print("-"+numbers[bit]);
            }
            }
            break;
        }
    }
输出:
-1=-1+2+3-5-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0可能的变异数为2^20;让我们生成从0到2^N的所有数字。这些数字的二进制表示形式将是0000020零,000…010000.10,…,111120个一。想象一下,每一个零都是负的,一个是正的

    int target = -1;
    int[] numbers = new int[20];
    Arrays.fill(numbers, 0);

    numbers[0] = 1;
    numbers[1] = 2;
    numbers[2] = 3;
    numbers[3] = 5;
    for(int i=0;i<(1<<20);i++) //masks from 00...00 to 11...11 (from --...--- to ++...+++)
    {
        int sum=0;
        for(int bit=0;bit<20;bit++)
        {
            if(((1<<bit)&i)>0)
            {
                sum+=numbers[bit];
            }
            else
            {
                sum-=numbers[bit];
            }
        }
        if(sum==target)
        {
            System.out.print(target+" = ");
            for(int bit=0;bit<20;bit++)
            {
            if(((1<<bit)&i)>0)
            {
                System.out.print("+"+numbers[bit]);
            }
            else
            {
                System.out.print("-"+numbers[bit]);
            }
            }
            break;
        }
    }
输出:
-1=-1+2+3-5-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0

如果数字不超过20个,那么简单的暴力法就可以了。如果数字不超过20个,那么简单的暴力法就可以了。