题目:
给定n个重量为w1,w2,w3 ……wn对应的物品价值分别为v1,v2,v3……vn,在不超过背包容积(C)的前提下,使包中价值达到最大。
求解方法:动态规划算法
方法一:借助一个二维数组arr,横坐标为背包容量,纵坐标为物品id(从0到n)
public static int knapSack(int w[],int v[],int c)
{
int size=w.length;
if(0==size) return 0;
int [][] arr =new int [size][c+1];
//初始化第一行
for(int i=0;i<=c;i++)
{
arr[0][i]=w[0]<=i ? v[0]:0;
//if(w[0]<i) arr[0][i]=v[0];
//else arr[0][i]=0;
//两种方式
}
for(int k=1;k<size;k++)
{
for(int j=0;j<=c;j++)
{
arr[k][j]=arr[k-1][j];
if(w[k]<=j)//w[i]可放入背包
{
int temp1=arr[k-1][j];//不放
int temp2=v[k]+arr[k-1][j-w[k]];//放入
arr[k][j]=Math.max(temp1, temp2);
}
}
}
return arr[size-1][c];
}
方法二:借助一维数组arr
public static int knapSack(int w[],int v[],int c)
{
int size=w.length;
if(0==size) return 0;
int [] arr =new int [c+1];
//初始化第一行
for(int i=0;i<=c;i++)
{
arr[i]=w[0]<=i ? v[0]:0;
}
for(int k=1;k<size;k++)
{
for(int j=c;j>=w[i];j--)
{
arr[j]=Math.max(arr[j],v[i]+arr[j-w[i]]);
}
}
return arr[c];
}