我需要计算数组中每个可能的数字组合的总和(单独的总和,而不是一个总数)。组合不能跳过一个数字,所以:
对于y> x你需要在[x]和[y]之间添加每个数字。
对于n大小的数组,你有(n)+(n-1)+(n-2)+ ... + 1,所以对于n = 5,有15种组合。
我需要尽快做,空间不是问题。
编辑:我试过了:
unsigned long long r_all = 0;
std::vector<int> g_seentimes(m);
for(int i = 0; i<n; i++)
r_all += w[z];
if(r_all > r){
r = r_all;
}
}
for(int j = 0; j<n; j++){
unsigned long long r_temp = r_all;
for(int i = 0; i<(n-j); i++){
r_temp -= w[n-i];
if( r_temp > r){
r = r_temp;
}
}
r_all -= w[y];
if( r_all > r){
r = r_all;
}
}
和
for(int i = 0; i < n; i++){
unsigned long long r_temp = 0;
for(int j = 0; j<(n-i); j++){
r_temp += w[i+j];
if(r_temp > r){
r = r_temp;
}
}
}
//r is the answer
编辑2: 预期的输出是最大可能的数量,但是我所提供的示例是简单的版本,如果组合中有两个或更多相同的数字,则不添加其中任何一个的值,因此{5,3,5,3,1} = 1,但{5,3,1} = 9.我得到了那个部分,只需要尽可能快的方式来完成所有组合。
编辑3: @Tuan333当被问及组合的数量时,我认为展示它会更容易:
X- chosen, x-unchosen
n = 5
XXXXX XXXXx XXXxx XXxxx Xxxxx
xXXXX xXXXx xXXxx xXxxx
xxXXX xxXXx xxXxx
xxxXX xxxXx
xxxxX
答案 0 :(得分:3)
首先制作累积部分和的数组。因此,如果您的数字为a = [1, 2, 3, 4, 5]
,则该数组将为b = [0, 1, 3, 6, 10, 15]
。 (注意,我在开头包含空的总和,所以第二个数组是一个更大的。
现在观察,i
的{{1}}到j
元素之和为a
。所以现在你可以做一个双循环。
答案 1 :(得分:1)
不如@btilly
的解决方案那么优雅,但这是一种生成所需序列的直观方法:
X- chosen, x-unchosen
n = 5
Xxxxx
xXxxx
xxXxx
xxxXx
xxxxX
XXxxx
xXXxx
xxXXx
xxxXX
XXXxx
xXXXx
xxXXX
XXXXx
xXXXX
XXXXX
对于每个“块”,您可以跟踪子序列中的数字数量(我们称之为blockLength)。然后你只需要迭代你的原始数组来获得所需的子序列,注意如果你当前的子序列有长度blockLength,那么你需要终止于(原始数组长度 - blockLength)项目。这是生成所有子序列的代码(Java)。如果有重复的数字,您可以通过预处理将它们全部删除。
int[] a = {5,3,1};
for(int subSeqLength = 1; subSeqLength <= a.length; subSeqLength++){
for(int j = 0; j + subSeqLength <= a.length; j++){
for(int k = j; k <j+subSeqLength; k++)
System.out.print(a[k]+" ");
System.out.println();
}
}