【代码随想录——动态规划——第五周】

news2024/11/24 12:30:43

1.单词拆分

在这里插入图片描述

func wordBreak(s string, wordDict []string) bool {
	n := len(s)
	dp := make([]bool, n+1)
	dp[0] = true
	for j := 0; j < len(wordDict); j++ {
		if len(wordDict[j]) > n {
			continue
		}
		if wordDict[j] == s[:len(wordDict[j])] {
			dp[len(wordDict[j])] = true
		}
	}
	//fmt.Println(dp)
	for i := 1; i < n; i++ {
		//fmt.Println(dp)
		if !dp[i] { //表明不能从当前位置开始续接这个字符串
			continue
		}
		for j := 0; j < len(wordDict); j++ {
			if len(wordDict[j])+i > n {
				continue
			}
			if wordDict[j] == s[i:len(wordDict[j])+i] {
				dp[len(wordDict[j])+i] = true
				if dp[n] {
					return dp[n]
				}
			}
		}

	}
	return dp[n]
}

2.多重背包理论基础

2.1 什么是多重背包问题

有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。
在这里插入图片描述

2.2 将多重背包展开为01背包

package main

import "fmt"

func main() {
	var C, N int
	fmt.Scanln(&C, &N)
	//C, N := 10, 3
	w := make([]int, N)
	v := make([]int, N)
	k := make([]int, N)
	for i := 0; i < N; i++ {
		fmt.Scan(&w[i])
	}
	for i := 0; i < N; i++ {
		fmt.Scan(&v[i])
	}
	for i := 0; i < N; i++ {
		fmt.Scan(&k[i])
	}
	//w := []int{1, 3, 4}
	//v := []int{15, 20, 30}
	//k := []int{2, 3, 2}
	sum := 0
	for i := 0; i < N; i++ {
		sum += k[i]
	}
	real_w := make([]int, sum)
	real_v := make([]int, sum)
	index := 0
	for i := 0; i < N; i++ {
		for j := 0; j < k[i]; j++ {
			real_w[index] = w[i]
			real_v[index] = v[i]
			index++
		}
	}
	//fmt.Println(real_w)
	dp := make([]int, C+1)

	for j := 0; j < sum; j++ { //物品种类
		for i := C; i >= real_w[j]; i-- { //背包大小
			if i-real_w[j] >= 0 {
				dp[i] = max(dp[i], dp[i-real_w[j]]+real_v[j])
			}
		}
		//fmt.Println(dp)
	}
	fmt.Println(dp[C])
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

2.3 优雅的写法

package main

import "fmt"

func main() {
	var C, N int
	fmt.Scanln(&C, &N)
	//C, N := 10, 3
	w := make([]int, N)
	v := make([]int, N)
	nums := make([]int, N)
	for i := 0; i < N; i++ {
		fmt.Scan(&w[i])
	}
	for i := 0; i < N; i++ {
		fmt.Scan(&v[i])
	}
	for i := 0; i < N; i++ {
		fmt.Scan(&nums[i])
	}

	dp := make([]int, C+1)

	for i := 0; i < N; i++ { //遍历物品
		for j := C; j >= w[i]; j-- { //遍历背包容量
			// 以上为01背包,然后加一个遍历个数
			for k := 1; k <= nums[i] && (j-k*w[i] >= 0); k++ {
				dp[j] = max(dp[j], dp[j-k*w[i]]+k*v[i])
			}
		}
	}
	fmt.Println(dp[C])
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

3. 背包问题总结篇

在这里插入图片描述
常用的五部走法:

  • 确定dp数组(dp table)以及下标的含义
  • 确定递推公式
  • dp数组如何初始化
  • 确定遍历顺序
  • 举例推导dp数组

常见的类型

  • 01背包
    • 一维dp数组的背包在遍历顺序上和二维dp数组实现的01背包其实是有很大差异的,大家需要注意!
  • 完全背包
    • 如果求组合数就是外层for循环遍历物品,内层for遍历背包。
    • 如果求排列数就是外层for遍历背包,内层for循环遍历物品。

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

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

相关文章

Facebook与地方文化:数字平台的多元表达

在当今数字化时代&#xff0c;社交媒体不仅仅是人们交流的工具&#xff0c;更是促进地方文化传播和表达的重要平台。作为全球最大的社交网络之一&#xff0c;Facebook在连接世界各地用户的同时&#xff0c;也成为了地方文化多元表达的重要舞台。本文将深入探讨Facebook如何通过…

简单通用防篡改水印组件封装(vue3)

一、项目结构 二、项目代码 1.App.vue <template><div class"container"><Watermark text"版权所有"><div class"content"></div></Watermark><Watermark text"禁止转载" style"backgr…

【MongoDB 新搭档 Kafka】

对于做过数据处理&#xff0c;使用过消息队列的小伙伴 &#xff0c;Kafka可以算是老朋友了&#xff0c;但是最近一个场景下&#xff0c;新的用法&#xff0c;让其变为了MongoDB的新搭档。 开始 从一个问题开始&#xff0c;熟悉MongoDB的小伙伴&#xff0c;可能使用过changeSt…

消息队列-Rabbit运行机制

Producer(生产者) 和 Consumer(消费者) Producer(生产者) :生产消息的一方&#xff08;邮件投递者&#xff09;Consumer(消费者) :消费消息的一方&#xff08;邮件收件人&#xff09; 消息一般由 2 部分组成&#xff1a;消息头&#xff08;或者说是标签 Label&#xff09;和 …

ABAP程序示例:如何用ABAP显示图形?

在SAP ERP 系统中&#xff0c;对于用户来说&#xff0c;一般都是用ABAP来开发自己报表或事务&#xff0c;用WRITE输出报表或用ALV来显示报表。可否将报表中的相关数据用类似如下图形来显示呢&#xff1f; 以下为示例代码&#xff1a; REPORT ZPR_GRAPHS.DATA: BEGIN OF ITAB_…

每日AI资讯-20240617

1. Meta AI的NLLB-200登上Nature Meta AI在社交媒体X上宣传自家的大模型NLLB&#xff0c;全称为No Language Left Behind&#xff0c;这个AI模型能够翻译200种语言&#xff0c;包括资源匮乏的语言&#xff0c;更难得的是&#xff0c;NLLB模型可以免费提供给非商业用途。 这项研…

PostgreSQL源码分析——initdb

数据库初始化 在安装完数据库后&#xff0c;需要进行初始化数据库操作&#xff0c;对应PostgreSQL数据库中就是需要进行initdb后&#xff0c;才能对数据库进行启动。initdb的过程&#xff0c;其实就是创建数据库实例的过程&#xff0c;生成模板数据库和相应的目录、文件信息&a…

一文读懂-Linux用户和权限

前言 最近换了台公司配的电脑&#xff0c;我的电脑本来就快坏了&#xff0c;结果放家里的门上挂着&#xff0c;pia的一下&#xff0c;摔了&#xff0c;a壳和b壳直接分离掉了&#xff08;还好公司给配的电脑配置挺高的&#xff09;&#xff0c; 仔细回顾了一下&#xff0c;已经…

Spring Cloud 专题-前言篇(1)

引言 随着微服务架构的兴起&#xff0c;Spring Cloud 作为一套基于 Spring Boot 实现的云应用开发工具集&#xff0c;为开发者提供了在分布式系统&#xff08;如配置管理、服务发现、断路器、智能路由、微代理、控制总线等&#xff09;中快速构建一些常见模式的能力。本篇文档…

HTTP 415错误状态码

HTTP 415错误状态码是指"Unsupported Media Type"&#xff08;不支持的媒体类型&#xff09;。这通常发生在客户端向服务器发送请求时&#xff0c;请求中包含的媒体类型&#xff08;例如Content-Type头部&#xff09;不被服务器支持或识别的情况下。 解决方法&#…

【Linux】进程间通信3——system V进程间通信

1.system V进程间通信 管道通信本质是基于文件的&#xff0c;也就是说操作系统并没有为此做过多的设计工作&#xff0c;而system V IPC是操作系统特地设计的一种通信方式。但是不管怎么样&#xff0c;它们的本质都是一样的&#xff0c;都是在想尽办法让不同的进程看到同一份由操…

哪个充电宝牌子好用又实惠?盘点四大平价充电宝分享

在当今快节奏的生活中&#xff0c;充电宝已成为我们日常生活中不可或缺的一部分。然而&#xff0c;面对市场上琳琅满目的充电宝品牌和型号&#xff0c;许多消费者误以为选择容量越大、价格越高的充电宝就是最好的选择。实际上&#xff0c;买充电宝并不是一味追求高容量和高价格…

首批50辆苏州金龙纯电大巴交付!武汉通勤客运绿色发展提质升级

随着第一缕阳光跃上黄鹤楼的飞檐&#xff0c;城市逐渐苏醒。在车水马龙中&#xff0c;一辆辆通勤班车穿梭其中&#xff0c;确保通勤保障单位人员的安全出行。而这其中就有武汉市雄翔通勤汽车运输有限公司&#xff08;以下简称“武汉雄翔”&#xff09;的身影。 5月底&#xff…

MySQL数据库与基本操作(增删改查)

一、数据库的基本概念 数据库要学习的四个基本概念&#xff0c;主要是&#xff1a;数据、数据库系统、数据库、数据管理系统。数据&#xff08;Date&#xff09;是描述事物的记录&#xff0c;数据库系统&#xff08;DBS&#xff09;&#xff0c;数据库管理系统&#xff08;DBMS…

大学物理(动量定理)

目录 冲量与动量 质点动量定理 质点系动量定理:​编辑 例题 ​编辑 例题 ​编辑 动量守恒定律:。 例题 ​编辑 例题 ​编辑 角动量 ​编辑 例题 ​编辑 力矩与角动量定理​编辑 角动量守恒定律: ​编辑 例题 冲量与动量 质点动量定理 质点系动量定理: 例题 例…

Java的三个接口Comparable,Comparator,Cloneable(浅拷贝与深拷贝)

Comparable 当我们要进行对象的比较的时候&#xff0c;我们是不能直接用>、< 这些符号直接进行比较的。 由于这是引用类型变量也是自定义类型变量&#xff0c;直接进行比较的时候&#xff0c;我们是通过对象的地址进行比较的&#xff0c;我们可以使用、! 进行两个对象的…

用这个神级提示词插件,能让你的AI绘画工具Stable diffusion提示词直接写中文!

大家好&#xff0c;我是设计师阿威 最近&#xff0c;有同学在使用AI绘画工具 Stable Diffusion的时候和我说&#xff1a;老师&#xff0c;我英文不好&#xff0c;能不能直接让我写中文提示词啊&#xff1f;最好可以直接在SD的输入框就能直接写中文&#xff0c;不用切换网页或者…

在有限的分数有限下如何抉择?是选好专业还是选好学校

随着2024年高考的落幕&#xff0c;无数考生和家长站在了人生的重要十字路口。面对成绩单上的数字&#xff0c;一个难题摆在了面前&#xff1a;在分数限制下我们该如何平衡“心仪的专业”与“知名度更高的学校”之间的选择&#xff1f; 一、专业决定未来职业走向 选择一个好的专…

低压电器航空插座端子

低压电器航空插座的定义和功能 低压电器航空插座通常指在交流电压1200V或直流电压1500V以下工作的电器&#xff0c;其主要功能是连接或断开电路&#xff0c;以实现对电路或非电对象的切换、控制、保护、检测、变换和调节。航空插座具有多种芯数和配置&#xff0c;例如2芯、3芯…

Java+Angular+Nginx+RESTful API 医院云HIS系统源码 全国中小型诊所都在用的诊所his系统门诊业务流程 自主版权

JavaAngularNginxRESTful API 医院云HIS系统源码 全国中小型诊所都在用的诊所his系统门诊业务流程 自主版权 HIS系统&#xff08;Hospital Information System&#xff09;在门诊业务中的应用带来了许多显著的优势&#xff0c;这些优势不仅提高了医疗服务的质量和效率&#xf…