调整数组使差最小 (01背包问题变形)(一个数组分成同大小部分或一个数组分成不同大小两部分)

最近看到两道背包问题变形的题目,形式很相似,做个总结。

01背包问题:在n个物体中向容量为V的背包中放,第i个物体的体积为C[i],其价值为W[i],如何选取使得背包中的物体总价值最大。(注意i是从1开始)

 

问题1:将数组分为两部分,不要求两部分元素个数一致,使得两部分的和最接近,返回两部分的差值。例如:

int[] array={1,0,1,7,2,4},分为两部分为{1,0,1,2,4},{7},差值为1。

 

思路:两部分和最接近,那么两部分的和尽量向sum(array)/2靠拢。也就是从array中选取若干个元素,使得选取的元素和尽量靠近sum(array)/2。

抽象成背包问题为:在n个物体中向容量为sum(array)/2的背包中放东西,每个东西的体积为array[i],价值为array[i],如何选取物体使得背包中的总价值最大。

 

有人就问了,让背包中的总价值最大,超过了sum(array)/2怎么办?

仔细想想就知道不会如此了,因为有V=sum(array)/2控制着,放了体积多大的东西,就贡献了多大的价值,体积是无法超过sum(array)/2,那么总价值也不会超过sum(array)/2。所以抽象背包问题的实际含义为如何选取物体使得物体中的总价值最接近sum(array)/2。

 

状态转移方程和01背包的状态转移方程一

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值