最近看到两道背包问题变形的题目,形式很相似,做个总结。
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背包的状态转移方程一