hdu2602 Bone Collector
滚动数组法 优点节省空间 缺点覆盖了中间状态
import java.util.Scanner;
class Bone{
int val;//价值
int vol;//体积
}
public class BoneCollector {
public static int T,N,V;
public static int []dp=new int[1011];
public static Bone[] bone=new Bone[1011];
public static int ans()
{//滚动数组 覆盖中间转移状态,无法输出背包方案
for(int i=1;i<=N;i++)
{
for(int j=V;j>=bone[i].vol;j--)//判断是否装得下 新的行覆盖原来的行 无i维度储存n内个物品时的状态
{
if(j-bone[i].vol<0) dp[j]=Math.max(dp[j],bone[i].val);
else dp[j]=Math.max(dp[j], dp[j-bone[i].vol]+bone[i].val);
}
}
return dp[V];
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
T=sc.nextInt();
while(T>0)
{
N=sc.nextInt();
V=sc.nextInt();
for(int i=1;i<=N;i++)
{
bone[i]=new Bone();
bone[i].val=sc.nextInt();
}
for(int i=1;i<=N;i++)
{
bone[i].vol=sc.nextInt();
}
System.out.println(ans());
T--;
}
}
}
矩阵dp法:优点记录每一步的最大价值,缺点是占用空间
for(int i;i<=N;i++)
for(int j=0;j<=V;j++)
{
if(bone[i].vol>j)dp[i][j]=dp[i-1][j];
else dp[i][j]=Math.max(dp[i-1][j],dp[i-1]j-bone[i].vol]+bone[i].val);
}