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

1.目标和

在这里插入图片描述

这里设置背包的最大长度为2100即可,因为题目中有说数组之和小于1000.但考虑到我们需要实行j+nums[i]所以保守起见我们设置的数应该稍大于2000即可,这里我们设置为2100。

1.1 我的解法(粗糙了)

func findTargetSumWays(nums []int, target int) int {//dp[i][j],这里的i代表nums中的前i个数,j代表targetn := len(nums)dp := make([][]int, n)maxNum := 2100for i := 0; i < n; i++ {dp[i] = make([]int, maxNum+1)}if nums[0] == 0 {dp[0][nums[0]] = 2} else {dp[0][nums[0]] = 1}for i := 1; i < n; i++ {for j := 0; j < maxNum-1000; j++ {target1 := abs(j - nums[i])target2 := abs(j + nums[i])if target1 != target2 || j == 0 || nums[i] == 0 {dp[i][j] = dp[i-1][target1] + dp[i-1][target2]} else {dp[i][j] = dp[i-1][target1]}}}return dp[n-1][abs(target)]
}func abs(a int) int {if a > 0 {return a}return -a
}

1.2 它解

假设加法的总和为x,那么减法对应的总和就是sum - x。

所以我们要求的是 x - (sum - x) = target

x = (target + sum) / 2

此时问题就转化为,装满容量为x的背包,有几种方法。

这里的x,就是bagSize,也就是我们后面要求的背包容量。

大家看到(target + sum) / 2 应该担心计算的过程中向下取整有没有影响。

这么担心就对了,例如sum 是5,S是2的话其实就是无解的。

func findTargetSumWays(nums []int, target int) int {sum := 0for _, v := range nums {sum += v}//target的绝对值已经大于sumif abs(target) > sum {return 0}//要么全为奇数,要么全为偶数if (sum+target)%2 == 1 {return 0}// 计算背包大小bag := (sum + target) / 2// 定义dp数组dp := make([]int, bag+1)// 初始化dp[0] = 1// 遍历顺序for i := 0; i < len(nums); i++ {for j := bag; j >= nums[i]; j-- {//推导公式dp[j] += dp[j-nums[i]]//fmt.Println(dp)}}return dp[bag]
}func abs(x int) int {return int(math.Abs(float64(x)))
}

2.一和零

在这里插入图片描述
思路:这里将i表示0的个数,j表示1的个数
当i大于等于字符串中0的个数且j大于等于字符串中1的个数时,可以得到递推公式为
dp[i][j] = max(dp[i][j], dp[i-itemList[k].num0][j-itemList[k].num1]+1)

func findMaxForm(strs []string, m int, n int) int {dp := make([][]int, m+1)for i := 0; i <= m; i++ {dp[i] = make([]int, n+1)}itemList := make([]*Item, 0)for i := 0; i < len(strs); i++ {num0, num1 := getCountOf01(strs[i])itemList = append(itemList, &Item{num0: num0, num1: num1})}//i表示0的个数,j表示1的个数for k := 0; k < len(strs); k++ {for i := m; i >= itemList[k].num0; i-- {for j := n; j >= itemList[k].num1; j-- {dp[i][j] = max(dp[i][j], dp[i-itemList[k].num0][j-itemList[k].num1]+1)}}//for i := 0; i <= m; i++ {//	fmt.Println(dp[i])//}//fmt.Println("==========")}return dp[m][n]
}func max(a, b int) int {if a > b {return a}return b
}type Item struct {num0, num1 int
}func getCountOf01(str string) (num0, num1 int) {for i := 0; i < len(str); i++ {if str[i:i+1] == "0" {num0++} else if str[i:i+1] == "1" {num1++}}return
}

3.完全背包理论基础

在这里插入图片描述
https://kamacoder.com/problempage.php?pid=1052

和零一背包的区别在于,这里面的材料可以重复拾取。

// test_CompletePack1 先遍历物品, 在遍历背包
func test_CompletePack1(weight, value []int, bagWeight int) int {// 定义dp数组 和初始化dp := make([]int, bagWeight+1)// 遍历顺序for i := 0; i < len(weight); i++ {// 正序会多次添加 value[i]for j := weight[i]; j <= bagWeight; j++ {// 推导公式dp[j] = max(dp[j], dp[j-weight[i]]+value[i])// debug//fmt.Println(dp)}}return dp[bagWeight]
}// test_CompletePack2 先遍历背包, 在遍历物品
func test_CompletePack2(weight, value []int, bagWeight int) int {// 定义dp数组 和初始化dp := make([]int, bagWeight+1)// 遍历顺序// j从0 开始for j := 0; j <= bagWeight; j++ {for i := 0; i < len(weight); i++ {if j >= weight[i] {// 推导公式dp[j] = max(dp[j], dp[j-weight[i]]+value[i])}// debug//fmt.Println(dp)}}return dp[bagWeight]
}func max(a, b int) int {if a > b {return a}return b
}

4.零钱兑换II

在这里插入图片描述

func change(amount int, coins []int) int {// 定义dp数组dp := make([]int, amount+1)// 初始化,0大小的背包, 当然是不装任何东西了, 就是1种方法dp[0] = 1// 遍历顺序// 遍历物品for i := 0; i < len(coins); i++ {// 遍历背包for j := coins[i]; j <= amount; j++ {// 推导公式dp[j] += dp[j-coins[i]]}}return dp[amount]
}

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

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

相关文章

Jackson指定json的key

指定json的key ‍ ‍ 要在序列化JavaBean时指定JSON的key&#xff0c;可以使用JsonProperty​注解来指定JavaBean属性序列化到JSON时使用的key。以下是一个简单的示例&#xff1a; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.da…

品质主管的面试题目

在品质主管的面试中,面试官可能会提出一系列问题来评估应聘者的经验、技能和专业知识。以下是一些常见的品质主管面试题,你可以提前准备,以更好地展示自己的能力和适应性。 一、自我介绍与背景了解 请简单介绍一下自己,包括教育背景、工作经验等。你在过去的工作经历中,主…

数据分析------知识点(六)

如何用数据说话 确定问题 如何写好数据分析报告中的确定问题部分 数据分析报告是数据分析师展示工作成果、影响业务决策的重要工具。而确定问题是数据分析报告的第一个也是最关键的部分。只有正确地确定了问题&#xff0c;后续的分析才能有的放矢&#xff0c;产生真正的价值…

BetterZip 5软件安装包下载

BetterZip是一款功能强大的Mac解/压缩软件&#xff0c;可以满足用户对文件压缩、解压、加密和保护等方面的需求。以下是关于BetterZip软件的主要功能、特点和使用方法的详细介绍&#xff0c;以及对其用户友好度、稳定性和安全性的评价。 安 装 包 获 取 地 址: BetterZip 5-安…

R语言 | 绘制带P值的差异柱状图

原文链接&#xff1a;R语言 | 绘制带P值的差异柱状图 本期教程 小杜的生信笔记&#xff0c;自2021年11月开始做的知识分享&#xff0c;主要内容是R语言绘图教程、转录组上游分析、转录组下游分析等内容。凡是在社群同学&#xff0c;可免费获得自2021年11月份至今全部教程&…

Docker配置代理

有时候我们在使用docker下载镜像的时候可能想要配置代理区下载那么本文就给大家分享一下docker怎么配置代理。 假设你已经有了代理&#xff0c;那就编辑/usr/lib/systemd/system/docker.service 在[Service]下添加 Environment"HTTP_PROXYhttp://127.0.0.1:6666/" E…

免费公开的源代码

虽然免费公开的软件被称为免费软件&#xff0c;但是一般不会公开源代码。另外&#xff0c;公开了源代码&#xff0c;并且可以免费使用&#xff0c;而且谁都可以自由进行修改并再次发布的软件被称为开源软件。 开源软件并不是特定企业开发的&#xff0c;大多数是由有关人士组织…

Spring 事务传播行为之Propagation.NESTED REQUIRES_NEW等探讨

当一个事务方法&#xff08;标记为Transactional(propagation Propagation.NESTED))被另一个活动事务调用时&#xff0c;它会创建一个“保存点”&#xff08;Savepoint&#xff09;作为新的事务开始点。这意味着&#xff0c;如果这个嵌套事务方法内部发生异常并导致回滚&#…

深入探讨:Spring与MyBatis中的连接池与缓存机制

深入探讨&#xff1a;Spring与MyBatis中的连接池与缓存机制 引言 在现代应用程序开发中&#xff0c;性能优化是一个永恒的话题。而在企业级Java应用开发中&#xff0c;Spring和MyBatis是两种非常流行的框架&#xff0c;它们的连接池和缓存机制对应用程序的性能有着至关重要的…

Vue55-TodoList案例-本地存储

一、TodoList案例-本地存储 此时&#xff0c;修改对象里面的属性&#xff0c;watch监视不到&#xff01; 需要深度监视&#xff0c;就不能用简写形式&#xff01; 二、jeecg-boot中的本地存储 jeecg-boot中&#xff0c;浏览器的本地存储&#xff0c;存储的是token&#xff01;…

kali - 配置静态网络地址 + ssh 远程连接

文章目录 观前提示&#xff1a;本环境在 root 用户下kali 配置静态网络地址打开网络配置文件 kali 配置 ssh 远程连接 观前提示&#xff1a;本环境在 root 用户下 kali 配置静态网络地址 打开网络配置文件 vim /etc/network/interfaces出现一下内容 # This file describes …

Parallels Desktop 19 for mac破解版安装激活使用指南

Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机&#xff0c;并于其中装设不同的操作系统&#xff0c;如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时&#xff0c;您可在 …

git 如何撤销已经 push 的 merge

今天在合并代码时, 发现自己失误把另外一个分支 B 的代码合并到了自己分支 C, 于是想到要撤销这次 merge 一般地, 如果我们想要撤销某次 commit 可以 git revert <commit-id>. 然而, 对于 merge 类型的 commit 不能直接 git revert <commit-id> 这里举个例子: 我…

最新编程语言排行榜,C++ 和 Go 成为新王?!

大家好&#xff0c; 我是不爱敲代码吖,2024 年 6 月最新的 TIOBE 编程语言排行榜已经发布&#xff0c;如图&#xff1a; 注意&#xff0c;TIOBE 编程语言排行榜是基于 全球 工程师的数量、课程、热门网站、第三方供应商综合计算出来的&#xff0c;只是一个编程语言流行度和趋势…

MBTI:探索你的性格类型

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

网络知识:这些特殊的IP地址,具体的用途你都知道吗

目录 一、0.0.0.0 二、255.255.255.255 限制广播地址 三、127.0.0.1 本机地址 四、224.0.0.1 组播地址 五、169.254.x.x 六、10.x.x.x、172.16。x。x&#xff5e;172.31。x。x、192.168。x。x 私有地址 对于计算机网络来说&#xff0c;IP地址是非常重要的概念&#xff0c…

Content Provider是什么?

一、技术难点 Content Provider是Android系统中一个重要的组件&#xff0c;它主要用于在不同的应用程序之间实现数据共享的功能。技术难点主要体现在以下几个方面&#xff1a; 数据安全性&#xff1a;Content Provider提供了一套完整的机制&#xff0c;允许一个应用程序访问另…

夯实网络底座:智能云解析助推新基建发展再上新台阶

在数字化浪潮汹涌澎湃的今天&#xff0c;互联网已成为社会运转不可或缺的基础设施。而在这背后&#xff0c;DNS&#xff08;域名系统&#xff09;作为互联网的底座&#xff0c;其重要性不言而喻。随着云计算、大数据、人工智能、IPv6等新基建的迅猛发展&#xff0c;传统的DNS服…

胡说八道(24.6.10)——数电与STM32

至此&#xff0c;信号与系统的简单笔记已经全部都写完了。其实&#xff0c;信号与系统的知识远远不只这些&#xff0c;总之&#xff0c;我的老师没讲完。其真实的原因是不在考试大纲里面。今天&#xff0c;看到一个短视频——学习的意义。其中有句话说&#xff0c;“因为考试不…

IEEE802.11a中的同步

目录 1.前言2.IEEE802.11a中的同步3.分组检测4.分组检测常用算法 微信公众号获取更多FPGA相关源码&#xff1a; 1.前言 最近有其他很多事情要做&#xff0c;接收机这部分本身内容也更难&#xff0c;涉及很多理论知识&#xff0c;本来之前对于随机信号和假设检验就没怎么学习透…