背包问题四种类型

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、01背包
  • 二、完全背包
    • 1.引入库
  • 三.多重背包
    • 优化:
  • 四.分组背包
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、01背包

import java.util.Scanner;
public class Main{public static void main(String[] args) throws Exception {// 读入数据的代码Scanner reader = new Scanner(System.in);// 物品的数量为Nint N = reader.nextInt();// 背包的容量为Vint V = reader.nextInt();// 一个长度为N的数组,第i个元素表示第i个物品的体积;int[] v = new int[N + 1] ;// 一个长度为N的数组,第i个元素表示第i个物品的价值;int[] w = new int[N + 1] ;for (int i=1 ; i <= N ; i++){// 接下来有 N 行,每行有两个整数:v[i],w[i],用空格隔开,分别表示第i件物品的体积和价值v[i] = reader.nextInt();w[i] = reader.nextInt();}reader.close() ;// 正式工作的代码/*定义一个二阶矩阵dp[N+1][V+1],这里之所以要N+1和V+1,是因为第0行表示只能选择第0个物品的时候,即没有物品的时候第0列表示背包的体积为0的时候,即不能装任何东西的时候dp[i][j]表示在 只能选择前i个物品,背包容量为j的情况下,背包中物品的最大价值对于dp[i][j]有两种情况:1. 不选择当前的第i件物品/第i件物品比背包容量要大,则dp[i][j] = dp[i-1][j]2. 选择当前的第i件物品(潜在要求第i件物品体积小于等于背包总容量),则能装入的物品最大价值为:当前物品的价值 加上 背包剩余容量在只能选前i-1件物品的情况下的最大价值dp[i][j] = dp[i-1][j-v[i]] + w[i]dp[i][j]在两种情况中选择比较大的情况作为当前的最优解;即:if(j >= v[i]):dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i]] + w[i])else:dp[i][j] = dp[i-1][j]*/int[][] dp = new int[N+1][V+1];dp[0][0] = 0;for(int i = 1; i <= N; i++){for(int j = 0; j <= V; j++){if(j >= v[i]){dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-v[i]] + w[i]);}else{dp[i][j] = dp[i-1][j];}}}System.out.println(dp[N][V]);}
}

二、完全背包

1.引入库

import java.util.Scanner;
public class Main {static int N=1010;static Scanner sc=new Scanner(System.in);static int n=sc.nextInt();static int m=sc.nextInt();static int v[]=new int[N];              //体积static int w[]=new int[N];              //价值static int f[][]=new int[N][N];public static void main(String[] args) {for(int i=1;i<=n;i++) {v[i]=sc.nextInt();w[i]=sc.nextInt();}for(int i=1;i<=n;i++) {                  //针对当前的第i个物品for(int j=0;j<=m;j++) {              //枚举所消耗的体积for(int k=0;k*v[i]<=j;k++) {f[i][j]=Math.max(f[i][j], f[i-1][j-k*v[i]]+w[i]*k);}}}System.out.println(f[n][m]);}}

三.多重背包

代码如下(示例):

/*
1. 状态定义: 已经选了1...i种物品且背包体积 <=j 时的最大值 -> 优化为f[j]
2. 状态计算: 以最后一次选i划分为选还是不选,根据遍历体积转化为选几次 即 f[j] = MAX (f[j - k* v[i]] + k*w[i] )
3. 边界:f[~] = 0
*/
import java.util.*;
public class Main{void run(){int n = jin.nextInt();int m = jin.nextInt();for (int i = 1 ; i <= n ; i++) {v[i] = jin.nextInt();w[i] = jin.nextInt();s[i] = jin.nextInt();}int res = dp(n, m);System.out.println(res);}int dp(int n, int m){int[] f = new int[maxN];for (int i = 1 ; i <= n ;i ++){for (int j = m ; j >= v[i] ; j--){for (int k = 0 ; k <= s[i] && k* v[i] <= j ;k++){// 把最简单的完全背包改写下f[j] = Math.max(f[j], f[j - k* v[i]] + k* w[i]);}}}return f[m];}int maxN = 1002;int[] v = new int[maxN];int[] w = new int[maxN];int[] s = new int[maxN];Scanner jin = new Scanner(System.in);public static void main(String[] args)  {new Main().run();}
}

优化:

#include<iostream>
using namespace std;const int N = 1010;int n, m;
int dp[N];int main(){cin >> n >> m;for(int i = 1; i <= n; i ++ ){int v, w;cin >> v >> w;for(int j = v; j <= m; j ++ ){dp[j] = max(dp[j], dp[j - v] + w);}}cout << dp[m] << endl;
}

四.分组背包

import java.io.*;
public class Main {static int N, V;static int[][] f;static int[] v = new int[101];static int[] w = new int[101];//因为每组中物品的体积和价值不知道,所以直接取个最大值static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));static BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));public static void main(String[] args) throws IOException {String[] str = reader.readLine().split(" ");N = Integer.parseInt(str[0]);V = Integer.parseInt(str[1]);f = new int[N + 1][V + 1];for (int i = 1; i <= N; i++) {int s = Integer.parseInt(reader.readLine());for (int k = 1; k <= s; k++) {String[] str1 = reader.readLine().split(" ");int v1 = Integer.parseInt(str1[0]);int w1 = Integer.parseInt(str1[1]);v[k] = v1;w[k] = w1;}for (int j = 0; j <= V; j++) {for (int k = 0; k <= s; k++) {//从每组中的si件物品中选择使f[i][j]总价值最大的if (j >= v[k]) {f[i][j] = Math.max(f[i][j], f[i - 1][j - v[k]] + w[k]);}}}}writer.write(f[N][V] + "");writer.flush();writer.close();reader.close();}
}

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/802520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十三章 OpenGL ES-RGB、HSV、HSL模型介绍

第十三章 OpenGL ES-RGB、HSV、HSL模型详细介绍 第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标 第二章 OpenGL ES 基础-GLSL语法简单总结 第三章 OpenGL ES 基础-GLSL渲染纹理 第四章 OpenGL ES 基础-位移、缩放、旋转原理 第五章 OpenGL ES 基础-透视投影矩阵与正交投影矩阵…

ubuntu23 安装nodejs

在 Ubuntu 23 上安装 Node.js&#xff0c;您可以遵循以下步骤&#xff1a; 步骤 1: 更新系统软件包 首先&#xff0c;确保您的 Ubuntu 系统软件包列表是最新的。打开终端&#xff08;Terminal&#xff09;并运行&#xff1a; sudo apt update输入您的用户密码&#xff08;输…

模拟memcpy和memmove

memcpy是内存复制函数&#xff0c;原型如下 void *memmove(void *dest, const void *src, size_t count) 从src地址复制count个字节到dest 模拟实现 void *memcpy(void *dest, const void *src, size_t count) {if (dest NULL || src NULL)return NULL;void *ans dest;f…

HackTheBox-Machines--CozyHosting

文章目录 1 端口扫描2 测试思路3 访问web站点4 横向移动5 权限提升 CozyHosting 测试过程 1 端口扫描 nmap -sC -sV 10.129.229.882 测试思路 目标开启了80和22端口&#xff0c;所以出发点从80端口开始。 1.通过在web网站寻找漏洞&#xff0c;获取到用户名和密码&#xff0c;远…

用GCC把C语言文件编译成Intel语法的汇编代码

2024年4月9日&#xff0c;周二下午 GCC默认把C语言文件编译成AT&T语法的汇编代码&#xff0c; GCC 提供了 -masmintel 选项来生成 Intel 风格的汇编代码&#xff0c; 通过如下命令可以编译成Intel语法&#xff1a; gcc -S -masmintel -o output.s input.c在这个命令中&a…

CSS层叠样式表学习(基础选择器)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS&#xff08;2&#xff09;的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 二、CSS基础选择器 2.1 CSS选择器的作用 2.2 选择器分类 2.3 标签选择器 2.…

Swift 异步序列 AsyncStream 新“玩法”以及内存泄漏、死循环那些事儿(上)

概览 异步序列&#xff08;Async Sequence&#xff09;是 Swift 5.5 新并发模型中的一员“悍将”&#xff0c;系统标准库中很多类都做了重构以支持异步序列。我们还可以用 AsyncStream 辅助结构非常方便的创建自己的异步序列。 这里我们就来一起聊聊 AsyncStream 结构&#xf…

写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果.(两个整数由键盘输入)

#include <stdio.h> /* * 主函数&#xff1a;计算并打印两个数的最大公约数和最小公倍数 */ int main(){ // 定义计算最大公约数和最小公倍数的函数 int hcf(int,int); int lcd(int,int,int); int u,v,h,l; // u,v为输入的两个数&#xff0c;h为最大公…

基于OTA技术的工作总结

一、引言 随着互联网的飞速发展和智能化设备的普及&#xff0c;OTA&#xff08;Over-the-Air&#xff09;技术逐渐成为了软件更新、远程配置及故障诊断的核心手段。在过去的一段时间里&#xff0c;我负责了基于OTA技术的相关工作&#xff0c;现将这段时间的工作进行总结&#…

win10下使用qemu安装aarch64架构的iso镜像虚拟机

1、win下安装qemu 最新版 可在如下链接进行下载安装 QEMU for Windows – Installers (64 bit) 2、准备aarch64的iso镜像 我这里使用的是 Kylin-Server-10-SP2-aarch64-Release-Build09-20210524.iso 3、使用如下命令启动虚拟机安装 打开powershell cd C:\Program Files\…

B02、关于垃圾回收器-6.2

1、关于 GC 的分类 1.1、串行 VS 并行 按线程数分&#xff0c;可以分为串行垃圾回收器和并行垃圾回收器。 串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作&#xff0c;此时工作线程被暂停&#xff0c;直至垃圾收集工作结束。 在诸如单CPU处理器或者较小的应…

【Leetcode】2009. 使数组连续的最少操作数

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个整数数组 n u m s nums nums 。每一次操作中&#xff0c;你可以将 n u m s nums nums 中 任意 一个元素替换成 任意 整数。 如果 n u m s nums nums 满足以下条件&…

记一次项目上某系统web渗透测试

第一个信息泄露漏洞 首先在登录页忘记密码处点击查询获取用户进行抓包可以获得用户的token固定id值 第二个用户名枚举漏洞 接下来就是批量遍历出存在数据库用户id值以及用户名&#xff0c;方便后面其他测试使用。 第三弱口令漏洞 这里对于爆破没有限制&#xff0c;因此根据获…

从零开始,教你如何用Java生成微信小程序二维码

Hello大家好我是咕噜铁蛋&#xff01;你是否曾为生成二维码而烦恼过&#xff1f;别担心&#xff0c;今天我就来给你支招&#xff01;&#xff0c;我将分享如何使用Java生成微信小程序二维码的方法&#xff0c;让你轻松应对二维码生成的需求。微信小程序是一种轻量级的应用程序&…

Splunk Attack Range:一款针对Splunk安全的模拟测试环境创建工具

关于Splunk Attack Range Splunk Attack Range是一款针对Splunk安全的模拟测试环境创建工具&#xff0c;该工具完全开源&#xff0c;目前由Splunk威胁研究团队负责维护。 该工具能够帮助广大研究人员构建模拟攻击测试所用的本地或云端环境&#xff0c;并将数据转发至Splunk实例…

[ LeetCode ] 题刷刷(Python)-第1题:两数之和

题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意…

蓝桥杯备考随手记: Java 中常用的集合类

Java中最常用的几个集合类包括ArrayList、LinkedList、HashSet、TreeSet和HashMap。 下面将详细介绍这些集合类及其方法。 ArrayList&#xff1a; 特点&#xff1a;基于数组实现&#xff0c;支持动态增长和随机访问&#xff0c;但插入和删除操作可能较慢。常见用法&#xff1a…

软件测试与康威定律的深层联系

在软件开发的世界中&#xff0c;软件测试是保证产品质量的关键步骤&#xff0c;而康威定律则提供了一个关于系统设计和组织结构如何相互影响的独特视角。本文将深入探讨软件测试的基本概念、重要性以及实施过程&#xff0c;并结合康威定律&#xff0c;分析其对软件测试实践的影…

什么是虚拟DOM(Virtual DOM),以及它在React或其他前端框架中的作用?

虚拟DOM&#xff08;Virtual DOM&#xff09;是一种在内存中以JavaScript对象的形式表示的轻量级的DOM副本。它是由React等前端框架使用的一种技术&#xff0c;用于提高页面渲染的性能和效率。 在传统的前端开发中&#xff0c;当页面中的数据发生变化时&#xff0c;通常需要直…

nginx到底是怎么工作的

工作流程 用户通过域名发出访问Web服务器的请求&#xff0c;该域名被DNS服务器解析为反向代理服务器的IP地址反向代理服务器接受用户的请求反向代理服务器在本地缓存中查找请求的内容&#xff0c;找到后直接把内容发送给用户如果本地缓存里没有用户所请求的信息内容&#xff0…