题目说明
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 ii 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式
第一行两个整数,N,V用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 ii 件物品的体积和价值。
输出格式
输出共一行,包含 n 个整数,表示排好序的数列。
数据范围
0<N,V≤1000
0<vi,wi≤1000
输入样例:
输出样例:
笔者理解
此题是一道排序算法问题,在AcWing题库中被定义为简单题。
解法
当笔者阅读完此题后,发现此题是最经典的背包的问题,也是比较经典的动态规划问题,让我们来看看具体如何实现的吧。
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| import java.util.Scanner; import java.lang.Math;
class Main {
static int N, V; static int[] v, w;
public static int count() { int[] dp = new int [V + 1];
for (int i = 1; i <= N; i++) { for (int j = V; j >= 0; j--) { if (j >= v[i - 1]) { dp[j] = Math.max(dp[j], dp[j - v[i - 1]] + w[i - 1]); } } }
return dp[V]; }
public static void main(String[] agrs) { Scanner sc = new Scanner(System.in);
N = sc.nextInt(); V = sc.nextInt();
v = new int[N]; w = new int[N];
for (int i = 0; i < N; i++) { v[i] = sc.nextInt(); w[i] = sc.nextInt(); }
sc.close();
System.out.println(count()); } }
|
总结
本题是今天的一题,难度是为简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。