题目要求
分析
这种题不能贪心,大家都懂的,应该使用DP。
比如容量为7,有三个物品体积是1,2,5,你要是先装小的,就只能装3,剩下4,但实际上可以装的只剩一个。
如果容量为10,三个物品体积是2,2,2,2,2,9,你要是先装最大的,就只能装9,剩下1,但实际上可以装满的。
嗯,本题可以看做一个基本的0/1背包问题:
一个物体的体积,关系着它的价值,也关系着它的代价。
题目变为:
有一个箱子容量为V(正整数,0 < V ≤ 20000),同时有n个物品(0 < n ≤ 30),每个物品有一个代价(体积)和一个价值(体积)。要求这n个物品中,任取若干个装入箱内,在不超出箱子容量的情况下,使总价值最大。
所以状态转移方程是:
AC代码(Java语言描述)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int v = scanner.nextInt(), num = scanner.nextInt();
int[] cost = new int[num];
int[] f = new int[v+1];
for (int i = 0; i < num; i++) {
cost[i] = scanner.nextInt();
}
scanner.close();
for (int i = 0; i < num; i++) {
for (int j = v; j >= cost[i]; j--) {
f[j] = Math.max(f[j], f[j-cost[i]]+cost[i]);
}
}
System.out.println(v-f[v]);
}
}