如何解决在对数组应用给定操作后最大化数组的总和
给定一个由 N 个元素和一个整数 K 组成的数组 A,您可以对数组进行任意次数的以下操作(可以为 0)。
操作中使用的所有 Y 的总和不应大于 K。
你的任务是求出数组A所有元素运算后的最大和。
示例:-
N=5
K=6
A={9,7,4,3}
输出:- 36
说明:- 在第一个操作中,选择第四个元素,Y=2。然后将 4 改为 4 xor 2,即 6。 更新后的数组将是:- 9,6,3
在第二个操作中,选择第五个元素,Y=4。然后将3改为3 xor 4,即7。 更新后的数组将是 9,7 因此总和是 36。
请有人解释问题背后的逻辑。我不明白。
解决方法
由于您没有澄清我对 Y
的评论,我假设答案是否定的,您不能将唯一的 Y
值计入预算 K
。
这个问题只是变相修改后的 0-1 knapsack problem。使用背包问题解决它:
让物品价值和重量对定义为集合
I = { (Y ^ a - a,Y) : a \in A,Y \in {1,K}}
将动态规划解决方案应用于重量限制为 K
的 0-1 背包问题,并且要求每个 a \in A
只能拣选一件物品。背包问题的总最优重量 + 任何未修改的 a \in A
就是解。
这是解决给定示例的 Python 实现。
#!/usr/bin/python
def solve2(w,v,W,nK):
n = len(w)
m = dict()
for j in range(0,W+1):
m[-1,j] = 0
for i in range(-1,n):
m[i,0] = 0
for i in range(0,n):
for j in range(0,W+1):
b_w = -1
b_v = -1
found = False
for k in range(0,nK):
if w[i][k] <= j and v[i][k] >= b_v:
b_w = w[i][k]
b_v = v[i][k]
found = True
if found:
m[i,j] = max(m[i-1,j],m[i-1,j-b_w] + b_v)
else:
m[i,j] = m[i-1,j]
return m[n-1,W]
A = [9,7,4,3]
K = 6
v = [ [ (Y^a)-a for Y in range(1,K+1) ] for a in A]
w = [ [ Y for Y in range(1,K+1) ] for a in A]
print ('Solution value is:',sum(A) + solve2(w,K,K))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。