说明:
Kattis正在几次远足旅行中带走她的一只小猫,他们需要收拾行囊。它们有许多物品(帐篷,烹饪设备,食物,衣服等),需要在它们之间尽可能均匀地分配重量。万一重量不能平均分配,Kattis将承担额外的重量。您可以帮助他们为每次旅行在他们之间拆分项目吗?
输入输入最多包含150个远足旅行。每个行程在输入中以一行形式给出。该行以1≤n≤20(它们需要拆分的项目数)开头。然后跟随每个项目的重量。重量均在[100,600]克的范围内。输入结束由包含单个0的行指示。
输出对于每次旅行,请输出两个背包的重量。首先输出Kattis背包的重量。
F(pos, sum)
和一个数组dp[pos][sum]
,它告诉我们是否以sum = pos
到达位置sum
。 我们使用以下dp转换:
F(pos + 1, sum + weights[pos])
//取当前体重
F(pos + 1, sum)
//跳过当前的重量
基本情况:if (pos == n + 1)
更新我们的答案
:让我们保留一个全局变量diff
,该变量跟踪两个背包的重量之间的绝对差。另一个变量total
是所有权重的总和。我们可以在基本案例中找出两个背包的重量,分别是sum
和total - sum
。利用此信息,我们可以更新diff
并存储两个背包的重量。void F(int pos, int sum) {
if (pos == n + 1) {
int first = sum, second = total - sum;
if (abs(first - second) < diff) {
diff = abs(first - second);
first_backpack = first, second_backpack = second;
}
return;
}
if (dp[pos][sum]) return;
dp[pos][sum] = 1;
F(pos + 1, sum);
F(pos + 1, sum + weights[pos]);
return;
}
:O(n *和),其中n = 20,和= 20 * 600复杂度