如何解决具有最大按位与积的数组子集的大小?
如果给定一个由 N 个整数组成的数组 A,我如何返回 A 的最大可能子集的大小,使其 AND 乘积大于 0???
我一整天都在这样做,但仍然无法得到想要的结果。
你们能看到我的代码有什么问题吗?
我正在输入一个大小为 N = {13,7,2,8,3} 的数组, 输出应该是 3,我得到 5...
感谢任何帮助。谢谢!!
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = Integer.valueOf(scan.nextLine());
int[] a = new int[n];
for(int i = 0; i < n; i++){
a[i] = Integer.valueOf(scan.nextLine());
}
int mAND = toBitWise(a);
int maxCombinados = checarMax(a,mAND);
System.out.println(maxCombinados);
}
private static int toBitWise(int[] a){
int nAND = 0;
for(int i = 0; i < a.length; i++){
nAND &= a[i];
}
return nAND;
}
public static int checarMax(int[] a,int i,int cAND,int cSize,int mAND){
if(i == a.length){
if(cAND == mAND){
return cSize;
}
else{
return a.length;
}
}
int prueba = checarMax(a,i + 1,cAND & a[i],cSize + 1,mAND);
int ign = checarMax(a,cAND,cSize,mAND);
return Math.max(prueba,ign);
}
}
解决方法
一个蛮力解决方案是尝试该 5 值集合的所有 31 个非空子集的排列。
要迭代排列,只需迭代数字 1-31,并检查 5 位以查看数组中的哪些值包含在结果中,即使用 bit-manipulation 查找排列,然后使用 bit-manipulation AND 排列的值。
static int findLargestSubset(int... values) {
if (values.length > 30)
throw new IllegalArgumentException("Too many values");
// Iterate all subsets (permutations),except the empty subset
int maxSubsetSize = 0;
int subsetCount = 1 << values.length;
for (int subsetMask = 1; subsetMask < subsetCount; subsetMask++) {
// 'AND' all values in the subset
int result = -1; // all bits set
for (int i = 0; i < values.length; i++)
if ((subsetMask & (1 << i)) != 0) // value is in subset
result &= values[i];
// Check subset size if result is non-zero
if (result != 0) {
int subsetSize = Integer.bitCount(subsetMask);
if (subsetSize > maxSubsetSize)
maxSubsetSize = subsetSize;
}
}
return maxSubsetSize;
}
测试
System.out.println(findLargestSubset(13,7,2,8,3)); // prints 3
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。