0/1背包问题

问题描述

设U = {u1,u2,u3,......ui}(一共有amount数量的物品)一组物品准备放入容量为size的背包中。

定义每个物品都具有两个属性weight和value.

问题是在所选取的物品总重量不超过背包容量size的前提下使所选的物品总价值最大.

程序的设计

设V[i, j]用来表示从前i项{u1......ui}中取出来的装入体积为j的背包的最大价值.i:[0,amount],j:[0,size].

计算的值就是V[amount, size].

V[0, j]对于所有的j的值都是0,因为这时候的包中没有物品.

V[i, 0]的值也是0,因为没有物品可以放到size为0的背包里面.

V[i, j] = 0 若i = 0 或 j = 0;

V[i, j] = V[i - 1, j] 若j < ui.weight;(当物品的重量大于背包承重时,就不把物品放在里面)

V[i, j] = max{ V [ i - 1, j ] , V[ i - 1, j - ui.weight ] + ui.value } 若i > 0并且j >= ui.weight;

以上三个式子+动态规划就可以解决问题了,但是也有缺陷:以上所设计的数均只能为整数;容量size可能很大

原文地址:https://www.cnblogs.com/eavn/p/1805389.html