侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 674 篇文章
  • 累计创建 128 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

【动态规划】装箱问题「动态规划之01背包模型」

GabrielxD
2023-02-14 / 0 评论 / 0 点赞 / 203 阅读 / 454 字
温馨提示:
本文最后更新于 2023-05-04,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

1024. 装箱问题 - AcWing题库


有一个箱子容量为 V,同时有 n 个物品,每个物品有一个体积(正整数)。

要求 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

输入格式

第一行是一个整数 V,表示箱子容量。

第二行是一个整数 n,表示物品数。

接下来 n 行,每行一个正整数(不超过10000),分别表示这 n 个物品的各自体积。

输出格式

一个整数,表示箱子剩余空间。

数据范围

0<V200000 < V \le 20000 ,
0<n300 < n \le 30

输入样例:

24
6
8
3
12
7
9
7

输出样例:

0

解题

方法一:动态规划

思路

01背包微变形,直接套模板即可。

其中:箱子容量是背包容量 c ,每个物品的体积既是每个物品的体积 v 又是价值 w ,所以最后答案就是背包容量减去最大价值。

代码

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        in.nextToken();
        int c = (int) in.nval;
        in.nextToken();
        int n = (int) in.nval;
        int[] f = new int[c + 1];
        for (int i = 1; i <= n; ++i) {
            in.nextToken();
            int v = (int) in.nval;
            for (int j = c; j >= v; --j) {
                f[j] = Math.max(f[j], f[j - v] + v);
            }
        }
        System.out.println(c - f[c]);
    }
}
#include <iostream>

using namespace std;

const int N = 20010;
int V, n;
int f[N];

int main() {
    scanf("%d%d", &V, &n);
    for (int i = 0; i < n; ++i) {
        int v;
        scanf("%d", &v);
        for (int j = V; j >= v; --j) {
            f[j] = max(f[j], f[j - v] + v);
        }
    }
    printf("%d\n", V - f[V]);

    return 0;
}
0

评论区