• 【蓝桥杯专项】初识0/1背包问题(Java)


    ✨哈喽,进来的小伙伴们,你们好耶!✨

    🛰️🛰️系列专栏:【蓝桥杯专项】

    ✈️✈️本篇内容:初识0/1背包问题!

    🚀🚀码云仓库gitee:Java数据结构代码存放!

    ⛵⛵作者简介:一名双非本科大三在读的科班Java编程小白,道阻且长,你我同行!

    在学习0/1背包问题之前,我们首先来了解一下一下什么是动态规划问题?

    动态规划(英语:Dynamic programming,DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。

    动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。 这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。

    原题链接acwing:0/1背包问题

    即有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?

    问题描述

    有 N 件物品和一个容量是 V的背包。每件物品只能使用一次。

    第 i件物品的体积是 vi,价值是 wi。

    求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
    输出最大价值。

    输入格式

    第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。

    接下来有 N行,每行两个整数 vi,wi,用空格隔开,分别表示第 i件物品的体积和价值。

    输出格式

    输出一个整数,表示最大价值。

    数据范围

    0 0

    输入样例

    1. 4 5
    2. 1 2
    3. 2 4
    4. 3 4
    5. 4 5

    输出样例:

    8
    

    假设我们这里给定体积用V[i]来表示,价值用w[i]表示,那么如果我们想得到最大价值max,那么就要对这里的集合进行划分,假设我们规定总价值用f(i,j)来表示,那么就分两种情况:

    1、不包含i;

    2、包含i;

    对于情况1:那么如果想得到最大价值,那么就必须在1~(i-1)的区间来寻找,所以问题也就等同于对f(i-1,j)取最大值。

    对于情况2:那么这里如果包含i的话,那么对于每份的数据我们可以同时减去i,因为带i不好求最大值,就像一组学生成绩是排好序的,我们给这组成绩同时减去10分,那么也不会影响最终的排名,所以也就是f(i-1,j-Vi)+Wi;j表示我们的体积,我们去掉了第i组数据,所以要减去i的体积也就是Vi,那么考虑完这些之后,我们还要加上i的价值,因为我们这一组是包含i的,所以i的价值也是需要参与运算的,所以最后的最大值max = Math.max(f(i-1,j),f(i-1,j-Vi)+Wi);最终的代码如下:

    代码实现:

    1. import java.util.Scanner;
    2. public class Main {
    3. /** 0/1背包问题
    4. *
    5. */
    6. public static void main(String[] args) {
    7. Scanner sc = new Scanner(System.in);
    8. int n = sc.nextInt();
    9. int m = sc.nextInt();
    10. int [] v = new int[1001];
    11. int [] w = new int[1001];
    12. int [][] f = new int[n+1][m+1];
    13. for (int i = 1; i <=n ; i++) {
    14. v[i] = sc.nextInt();
    15. w[i] = sc.nextInt();
    16. }
    17. for (int i = 1; i <=n ; i++) {
    18. for (int j = 0; j <=m ; j++) {
    19. if (j < v[i]) f[i][j] = f[i - 1][j];
    20. else f[i][j] = Math.max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
    21. }
    22. }
    23. System.out.println(f[n][m]);
    24. }
    25. }

    运行结果:

  • 相关阅读:
    红外避障模块介绍
    第2章 MyBatis的核心配置
    轻量级的低级线程和任务框架---Argobots
    JQuery AJAX 通过一般处理程序 取列表
    擎创动态 | 十天拿下12项信创认证,入选2022智能运维企业TOP50榜单,这个公司到底什么来头
    Filebeat+Kafka+ELK搭建
    OCR文本识别-褶皱与卷曲
    什么是文件格式的幻数
    JavaScript 30. JSON
    频谱和信道基础
  • 原文地址:https://blog.csdn.net/m0_62426532/article/details/127797698