题目
有 N种物品和一个容量是 V 的背包,每种物品都有无限件可用。
第 i 种物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式
第一行两个整数,N、V,用空格隔开,分别表示物品种数和背包容积。
接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 种物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
0<N,V≤10000<N,V≤1000
0<vi,wi≤1000
代码
import java.util.Scanner;
public class _完全背包 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int N=scanner.nextInt();
int V=scanner.nextInt();
int[] dp=new int[V+1];
for(int i=1;i<=N;i++){
int v=scanner.nextInt();
int w=scanner.nextInt();
for(int j=v;j<=V;j++){
dp[j]=Math.max(dp[j],dp[j-v]+w);
}
}
System.out.println(dp[V]);
scanner.close();
}
}
详解
-
import java.util.Scanner;
- 导入
Scanner
类,用于从标准输入(通常是键盘)读取数据。
- 导入
-
public class _完全背包 {
- 定义一个名为
_完全背包
的公共类。
- 定义一个名为
-
public static void main(String[] args){
- 定义主函数,程序的执行从这里开始。
-
Scanner scanner = new Scanner(System.in);
- 创建一个
Scanner
对象,用于从标准输入读取数据。
- 创建一个
-
int N=scanner.nextInt();
- 读取第一个整数
N
,表示物品的数量。
- 读取第一个整数
-
int V=scanner.nextInt();
- 读取第二个整数
V
,表示背包的容量。
- 读取第二个整数
-
int[] dp=new int[V+1];
- 创建一个整数数组
dp
,长度为V+1
。这个数组用于存储中间结果和最终答案。
- 创建一个整数数组
-
for(int i=1;i<=N;i++){
- 开始一个循环,遍历每个物品。
-
int v=scanner.nextInt();
- 读取当前物品的重量。
-
int w=scanner.nextInt();
- 读取当前物品的价值。
-
for(int j=v;j<=V;j++){
- 开始一个内循环,从当前物品的重量
v
开始,直到背包容量V
。
- 开始一个内循环,从当前物品的重量
-
dp[j] = Math.max(dp[j],dp[j-v]+w);
- 更新
dp
数组。这里的意思是:对于当前的背包容量j
,我们要么选择不放入这个物品(保持dp[j]
不变),要么选择放入这个物品(dp[j-v]+w
)。我们选择两者中的较大值。
- 更新
-
}
- 内循环结束。
-
}
- 外循环结束。
-
System.out.println(dp[V]);
- 输出
dp[V]
,即背包容量为V
时的最大价值。
- 输出
-
scanner.close();
- 关闭
scanner
对象,释放资源。
- 关闭
-
}
- 主函数结束。
-
}
- 类定义结束。