所有要求要么打印最大的数组,要么打印长度最大的数组。我想打印那些连续数组的所有组合,这些数组可以被给定的数整除。我试图解决这个问题,并想出了这个解决方案
#include<iostream>
using namespace std;
void function(int arr[], int start, int end, int div, int sum)
{
if(start>end)
return;
if(!(sum%div))
{
if(start<end)
{
for(int i=start;i<=end;i++)
{
cout<<" "<<arr[i];
}
cout<<endl;
}
}
function(arr, start+1, end, div, sum-arr[start]);
function(arr, start, end-1, div, sum-arr[end]);
}
int main()
{
int arr[] = {2, 6, 3, 8, 5, 7, 4, 1};
int div;
int size = sizeof(arr)/sizeof(*arr);
cout<<" Enter divisor :- ";
cin>>div;
int sum = 0;
for(int i=0;i<size;i++)
sum+=arr[i];
function(arr, 0, size-1, div, sum);
cout<<endl;
system("PAUSE");
return 0;
}
这段代码非常复杂,我可以想出一个更多的解决方案,使用两个复杂度为O(n^2)的循环。我们能以n^2倍的复杂度更好地做到这一点吗?
我假设你已经读过答案,找到一个数组的子数组的个数,个数组的和被给定的个数除以。
如果是,那么您可以修改上述算法如下:
Input: 0 5 3 8 2 1
X = 3
Sum: 0 0 5 8 16 18 19
Mod 3: 0 0 2 2 1 0 1
所有你需要做的是打印数组每当你看到相同的值在“mod 3”输出数组。因此,在上面的例子中,您将打印索引[0]、[2]、[0,4]、[1,4]和[4,5]中的数组。
0 5 3 8 2 1
- 0 = 0 % 3 = 0
------------- 0 + 5 + 3 + 8 + 2 = 18 % 3 = 0
---------- 5 + 3 + 8 + 2 = 18 % 3 = 0
- 3 = 3 % 3 = 0
---- 2 + 1 = 3 % 3 = 0
可能的子集:- 我只能想到一个朴素的算法,它列出集合的所有子集,并检查子集和是否>=k,但它是一个指数算法,列出所有子集需要O(2^n)。我能用动态规划在多项式时间内求解吗?
我知道强力解O(n^2),我想要另一个解O(n),还是O(n,log,n)?
我一直在练习算法问题,我遇到了这个问题。 给定一个数组(+VE和-VE),我必须找到一个连续的子数组,这样,和可以被任意数K整除,并且该子数组可能是最大和。对于 和,可被k整除的最大和子数组是 ,目前我所能想到的是,每个元素都有两种可能,要么包含在目标子数组中,要么不包含在目标子数组中。但这将是一个指数算法。 编辑:是否有可能在线性时间内解决这个问题。请帮忙
我正在寻找以下问题的答案。 给定一组整数(无重复项)和一个和,找出集合元素的所有可能组合,并求和。解的顺序并不重要(解{2,2,3}和{3,2,2}是相等的)。 请注意,最终组合不需要是集合,因为它可以包含重复。 示例:集合{2,3,5}和10 结果:{2, 2, 2, 2, 2},{2,2,3,3},{2,3,5},{5,5} 我已经研究过子集和问题以及硬币兑换问题,但不能使它们适应我的需要。我
如何编写一个递归回溯函数,在该函数中,它打印所有的N位数字,使数字中每3个连续数字的总和正好等于S,其中N小于或等于10,并且是从0到27。 代码: 示例输出: 我很困惑如何递归地写这个。
我正在尝试构造一个程序,该程序将获取一个int({1,2,3})数组和一个长度值,并计算该数组的所有可能组合。 例如: 这将输出: 但是当我尝试在 for 循环中调用可能的梳子时,我不断收到堆栈溢出错误 }