动态规划求解"装箱问题"(洛谷P1049题题解,Java语言描述)

题目要求

P1049题目链接
在这里插入图片描述

分析

这种题不能贪心,大家都懂的,应该使用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个物品中,任取若干个装入箱内,在不超出箱子容量的情况下,使总价值最大。

所以状态转移方程是: f [ j ] = M a t h . m a x ( f [ j ] , f [ j c o s t [ i ] ] + c o s t [ i ] ) f[j] = Math.max(f[j], f[j-cost[i]]+cost[i])

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]);
    }
}
发布了700 篇原创文章 · 获赞 1489 · 访问量 67万+

猜你喜欢

转载自blog.csdn.net/weixin_43896318/article/details/104838352