0
我很难解决这个编程问题。我需要从2 <= N <= 30
的任意位置获取大小为N
的整数。我需要将数组分成两个较小的数组,它们的总和相等,如果它们不相等,则它们需要尽可能接近相同的值。我猜想在这种情况下使用某种递归函数是理想的,但如果不是这样的话,动态编程的解决方案也会起作用。划分整数2甚至总和
我很难解决这个编程问题。我需要从2 <= N <= 30
的任意位置获取大小为N
的整数。我需要将数组分成两个较小的数组,它们的总和相等,如果它们不相等,则它们需要尽可能接近相同的值。我猜想在这种情况下使用某种递归函数是理想的,但如果不是这样的话,动态编程的解决方案也会起作用。划分整数2甚至总和
我想你可以查看wikipedia article on Partition problem。它提供了在C#伪多项式算法的伪代码,你可以比较容易地转换成C++:
public static bool BalancePartition(int[] S)
{
int n = S.Length;
int N = S.Sum();
bool[,] P = new bool[N/2 + 1, n + 1];
for (int i = 0; i < n + 1; i++)
P[0, i] = true;
for (int i = 1; i <= N/2; i++)
for (int j = 1; j <= n; j++)
if (S[j - 1] <= i)
P[i, j] = P[i, j - 1] || P[i - S[j - 1], j - 1];
else
P[i, j] = P[i, j - 1];
return P[N/2, n];
}
退房平衡划分问题 – taocp 2014-10-06 21:04:28
你会变得非常有名,如果你能在多项式时间内解决这个问题.. – arunmoezhi 2014-10-06 21:06:12
动态规划不是递归的替代解决方案。相反,有时你可以通过避免重复计算一些事情来加速递归。 – Simon 2014-10-06 21:23:52