动态规划之01背包问题及leetcode实例

本文探讨了动态规划在解决01背包问题中的应用,并结合LeetCode的第416题,详细分析了如何判断数组能否分成两个和相等的子集。通过建立二维数组d[i][j]来表示前i个元素中选择子序列达到和j的可能性,最终确定当j等于数组和一半时的解。
摘要由CSDN通过智能技术生成

01背包问题

这篇文章讲的很清楚,我这里就不赘述了。

https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html

leetcode problem 416

描述

Given a non-empty array containing only positive integers,
find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.

即判断能不能将给定数组分成两份,使他们的和相等。

分析

题目就是要从数组中找一个序列,使他们的和为sum/2。如果暴力硬解,挑选的数组子序列个数不定,复杂度太高,肯定不可取。事实上这是一个01背包问题,对于每个数字,要么选中要么不选中。

具体的,用一个二维数组d[i][j]表示,从前i个元素中挑选子序列是否可以计算出和j。那么我们只要知道当j=sum/2的时候,d[i][j]是否为true。

d[i][j]结果的得出,可以有两种情况

  • d[i-1][j]已经为true,也就是说,已经可以由前i-1个元素中挑选子序列计算出和j,那么d[i][j]自然为true。
  • d[i-1][j-nums[i]]为true,也就是说,前i-1个元素中挑选子序列计算出和j-n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值