这是一个 很难解决的 算法问题:
将列表分为两部分(总和),它们的总和彼此最接近(最接近)
列表长度为1 <= n <= 100,并且其(数字)权重为1 <= w <= 250(在问题中给出)。
例如:23 65 134 32 95 123 34
1.sum = 256
2.sum = 250
1.清单= 1 2 3 7
2.清单= 4 5 6
我有一个算法,但不适用于所有输入。
实现:list1 = [],list2 = []
等等…
问题是NPC,但是有一个伪多项式算法,这是一个2分区问题,您可以按照伪多项式时间算法的方法解决子集总和问题。如果输入大小与输入值在多项式上相关,则可以在多项式时间内完成。
在您的情况下(权重<250)是多项式(因为权重<= 250 n =>和<= 250 n ^ 2)。
令Sum =权重之和,我们必须创建二维数组A,然后逐列构造A
如果(j == weight [i]或j-weight [i] = weight [k](k在列表中)),则A [i,j] = true。
使用此算法创建数组需要O(n ^ 2 * sum / 2)。
最后,我们应该找到具有真正价值的最有价值的专栏。
这是一个例子:
项目:{0,1,2,3}权重:{4,7,2,8} => sum = 21 sum / 2 = 10
items/weights 0| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
---------------------------------------------------------
|0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0
|1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0
|2 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1
|3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1
因此,因为a [10,2] == true,则分区为10,11
这是我在这里找到的算法,并进行了一些编辑以解决您的问题:
bool partition( vector< int > C ) {
// compute the total sum
int n = C.size();
int N = 0;
for( int i = 0; i < n; i++ ) N += C[i];
// initialize the table
T[0] = true;
for( int i = 1; i <= N; i++ ) T[i] = false;
// process the numbers one by one
for( int i = 0; i < n; i++ )
for( int j = N - C[i]; j >= 0; j--)
if( T[j] ) T[j + C[i]] = true;
for(int i = N/2;i>=0;i--)
if (T[i])
return i;
return 0;
}
我只是返回了第一个T [i],而不是返回T [N / 2](以最大到最小的顺序),这是正确的。
寻找给出该值的路径并不难。
给定一个整数列表,我如何将其划分为两个列表和,使得最小。我知道这个问题是NP完全的,所以我正在寻找一个伪多项式时间算法,即其中。我看了维基百科,但是算法是把它分成精确的两半,这是我要找的一个特例... 编辑:为了澄清,我正在寻找确切的分区和,而不仅仅是产生的最小差异 概括地说,什么是伪多项式时间算法,将一个数字列表划分成组,使得S=[和(g1),和(g2),...和(gk)]
问题内容: 我正在寻找一种将python列表轻松分成两半的方法。 这样,如果我有一个数组: 我将能够得到: 问题答案: 如果需要功能:
如果给出了类似的输入,那么输出应该是。同样,然后。 但我有个错误。我应该怎么做才能达到那个输出呢?
给定一个< code>n数和sum 的列表,将这些数分成< code >两个组,使得每组中的数之和小于或等于s。如果可以分组,则打印< code>YES,如果不能分组,则打印< code>NO。 例如,如果< code>n=3,s=4和< code>n数是< code>2,4,2。在这种情况下,输出为< code>YES,因为可以形成两个组< code>(2,2)和(4)。 我的解决方案如下。 是
问题内容: 在Java中将列表拆分为两个子列表的最简单,最标准和/或最有效的方法是什么?可以更改原始列表,因此无需复制。方法签名可以是 [EDIT] 返回原始列表上的视图,如果修改了原始视图,该视图将无效。因此,除非它也放弃了原始参考文献,否则无法使用(或者,如Marc Novakowski的回答所述,使用但立即复制结果)。 问题答案: 快速半伪代码: 它使用标准的List实现方法,并避免了所有循
问题内容: 这是给俄罗斯方块的。玻璃(蓝色)位于左侧,控件(红色面板)位于右侧。换句话说,现在我只想将框架分为两部分:左(较宽)部分是蓝色,右部分是红色。而已。但是我似乎没有做到这一点。 因此,我的逻辑是:让框架具有FlowLayout。然后,我添加了两个面板,这意味着它们应该连续放置。 我准备了这个: 但是在屏幕上仅可见灰色框。你能帮我理解为什么吗? 问题答案: 正如Amir所说,您想为此使用J
问题内容: 我有几个Docker容器,还有一个特例,其中两个必须互相交谈,因此它们必须通过链接最多彼此了解。我可以将一个容器链接到另一个容器,但是问题是,我不能告诉他们第二个容器可以与第一个容器对话。 我尝试创建并运行第一个容器并将其停止,然后创建了第二个容器并同时将其停止。接下来,我再次启动了第一个容器并链接到第二个容器,并启动了第二个容器并链接到第一个容器。此后,我的机器发疯了,docker进
问题内容: 我使用PostgreSQL9.4我有一个名为表列,并希望写一个查询将返回的时间范围在两个单独的列和。我试图像数组一样处理它,但是它不起作用: 当前表: 所需表: 问题答案: 使用 和。 像这样: 或您的示例: