给出n个物品的体积A[i]和其价值V[i],将他们装入一个大小为m的背包,最多能装入的总价值有多大?
A[i], V[i], n, m均为整数。你不能将物品进行切分。你所挑选的物品总体积需要小于等于给定的m。
样例
A[i], V[i], n, m均为整数。你不能将物品进行切分。你所挑选的物品总体积需要小于等于给定的m。
样例
对于物品体积[2, 3, 5, 7]和对应的价值[1, 5, 2, 4], 假设背包大小为10的话,最大能够装入的价值为9。
import java.util.Scanner;
/**
*
* 给出n个物品的体积A[i]和其价值V[i],将他们装入一个大小为m的背包,最多能装入的总价值有多大?
A[i], V[i], n, m均为整数。你不能将物品进行切分。你所挑选的物品总体积需要小于等于给定的m。
样例
对于物品体积[2, 3, 5, 7]和对应的价值[1, 5, 2, 4], 假设背包大小为10的话,最大能够装入的价值为9。
* @author Dell
*
*/
public class Test125 {
public static int backPackII(int m,int[] A, int[] V)
{
int[][] dp=new int[A.length+1][m+1];
dp[0][0]=0;
for(int i=1;i<=A.length;i++)
{
dp[i][0]=0;
}
for(int j=1;j<=m;j++)
{
dp[0][j]=0;
}
for(int i=1;i<=A.length;i++)
{
for(int j=1;j<=m;j++)
{
int x=dp[i-1][j];
int y=0;
if(j>=A[i-1])
{
y=dp[i-1][j-A[i-1]]+V[i-1];
}
dp[i][j]=Math.max(x, y);
}
}
return dp[A.length][m];
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int m=sc.nextInt();
int n=sc.nextInt();
int[] A=new int[n];
int[] V=new int[n];
for(int i=0;i<A.length;i++)
{
A[i]=sc.nextInt();
}
for(int i=0;i<V.length;i++)
{
V[i]=sc.nextInt();
}
System.out.println(backPackII(m,A,V));
}
}