01背包问题是最基本的背包问题,其题意可大概描述为一共有N件物品,每件物品都有其相应的体积和价值,给你一个背包,背包有容量上限,怎样往背包中装物品,能让背包中的物品价值最高。
此类问题是典型的动态规划问题,动态规划的目标是背包中物品的总价值,动态规划的变量是物品的体积和价值,以及背包的容量上限,经过分析,我们可以定义一下dp状态:
dp[ i ][ j ] —— N件物品中以前i件物品为物品总量,当装入背包的物品的总体积为j时,背包中所有物品的总价值
dp[ i ][ j ]有两种情况:1. 第i件物品不装入背包 2.第i件物品装入背包(装入背包需要满足物品装入背包后背包容量没有超限)
据此我们可以得到状态转移方程:
if j - volume of bag[i] >= 0
dp[i][j]=max( dp[i-1][j] , dp[i-1][j-volume of bag[i]] + value of bag[i] )
else
dp[i][j]=dp[i-1][j]
完整代码:
/**
*
* @param value 物品价值
* @param volume 物品体积
* @param max 背包最大容量
* @return 背包所装物品的最大价值
*/
public int findMaxValue(int[]value,int[]volume,int max) {
int l=value.length;
int[][]dp=new int[l+1][max+1];
for(int i=1;i<=l;i