背包问题变形(动态规划),求一堆数字分成两组,使得两组和的差值最小。...

本文介绍了如何运用动态规划解决一个变形的背包问题:将一组数字分成两组,使得两组和的差值最小。通过Python代码实现动态规划算法,找出最优解并展示结果。
摘要由CSDN通过智能技术生成

 这个问题类似于背包问题,我们只要稍微改编一下就行。也就是相当于从一堆数字里面挑选一些数,然后使其接近总和的1/2。然然加入的每个数字的价值都看成1。下面附上python写的源代码,供大家参考。

import numpy as np
#n个物体的重量(w[0]无用)
w = np.array([0, 2, 5, 6, 9, 4, 5, 8, 5])
#n个物体的价值(p[0]无用)
p = [0, 1, 1, 1, 1, 1, 1, 1, 1]
#计算n的个数
n = len(w) - 1
#背包的载重量
m = int(np.ceil(0.5*np.sum(w)))
#装入背包的物体,元素为True时,对应物体被装入(x[0]无用)
x = [False for raw in range(n + 1)]
#optp[i][j]表示在前i个物体中,能够装入载重量为j的背包中的物体的最大价值
optp = [[0 for col in range(m + 1)] for raw in range(n + 1)]

def knapsack_dynamic(w, p, n, m, x):
#计算optp[i][j]
for i in range(1, n + 1):
for j in range(1, m + 1):
optp[i][j] = optp[i - 1][j]
if (j >= w[i]) and (optp[i - 1][j - w[i]] + p[i] > optp[i - 1][j]):
optp[i][j] = optp[i - 1][j - w[i]] + p[i]

#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值