Algorithm 如何使用+或-运算从数字列表中获取数字
在我的问题中,我们得到了一个数字和一系列数字,我们应该使用+或- 例如: -1是目标号码 1 2 3 5是为得到-1而给出的数字 解决方案应为-1+2+3-5=-1 或-1-2-3+5=-1 目标编号的限制范围为-180到+180,编号列表的限制范围为2到20 要找到解决方案,应该使用什么样的算法?如果我想使用生成所有的可能性,它会有效吗?这个问题有二进制解吗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
感谢您的帮助可能的变体数量为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个,那么简单的暴力法就可以了。