Arrays 将整数数组分解为具有精确和的最大子数组数

Arrays 将整数数组分解为具有精确和的最大子数组数,arrays,algorithm,discrete-mathematics,Arrays,Algorithm,Discrete Mathematics,如果我有一个整数数组,比如 {3,5,5,6,6,6,6,6,7,7,8,8,8,9,9} 我想创建最大数量的子阵列,每个元素只使用一次,子阵列的数量增加到40个。只要没有使用所有的重复次数,重复次数就可以了 很容易找到最大数量的子阵列和40的子阵列,但是问题是找到提供40的子阵列,并且不阻止形成其他40的子阵列 我需要生成子集的输出 这听起来与分区问题非常相似 这个问题有名字吗?有人有解决办法吗?也许效率不高,但你可以做以下几件事——找到40的倍数来解决子集和问题,从40的最大倍数开始,你可以

如果我有一个整数数组,比如

{3,5,5,6,6,6,6,6,7,7,8,8,8,9,9}

我想创建最大数量的子阵列,每个元素只使用一次,子阵列的数量增加到40个。只要没有使用所有的重复次数,重复次数就可以了

很容易找到最大数量的子阵列和40的子阵列,但是问题是找到提供40的子阵列,并且不阻止形成其他40的子阵列

我需要生成子集的输出

这听起来与分区问题非常相似


这个问题有名字吗?有人有解决办法吗?

也许效率不高,但你可以做以下几件事——找到40的倍数来解决子集和问题,从40的最大倍数开始,你可以使用动态规划。设
dp[j]-总计为40 s.t.的最大分段数。没有分段索引大于j
。然后您可以执行以下操作:

for(int i = 0; i < numbers.size(); i++)
    for(int j = i, sum = numbers[j]; j >= 0 && sum <= 40; j--, sum += numbers[j]) {
        if(sum == 40) {
            dp[i] = max(dp[i], j > 0 ? dp[j-1] : 0);
        }
    } 

int answer = 0;
for(int i = 0; i < dp.size(); i++)
    answer = max(answer, dp[i]);
for(int i=0;i=0&&sum 0?dp[j-1]:0);
}
} 
int-answer=0;
对于(int i=0;i

我认为代码应该是不言自明的。

子数组是指子集还是切片?如果是前者,这显然是一个NP难问题,因为它至少和子集和问题一样难。整数集允许从更大的集合中提取重复项。因此,您正在寻找一个多集合的分区,它最大化和为1的片段数。这可以被认为是一个箱子包装问题,其目标是最大限度地增加装满箱子的数量,而不是最大限度地减少箱子的总数。在我之前的评论中,我的意思是“总计40个”。文献中有一种称为双箱包装问题的方法,其目标是最大限度地增加满箱或过满箱的数量。肯定有人在某个地方研究过变量,其中约束条件是等于容量,而不是超过容量。我喜欢这个解决方案,约翰,这对我来说已经足够好了。我一直在思考解决这个问题的最佳方法大约一个小时了,但我准备去次优!