题目链接:分割等和子集
题目描述:给你一个 只包含正整数 的 非空 数组 nums
。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
思路:将数组分割成两个等和的子集。
那么:
1)数组元素的和肯定得是偶数,并且数组长度必须大于1。且数组最大值不能大于数组和的一半
2)问题转换为:数组中是否存在若干个元素,其和为数组所有元素和的一半。即寻找若干元素的和为target。
本来的思路是:将元素排序,然后使用回溯的方法,通过了100多个样例。剩下几个样例错误,经过反复思考和尝试发现回溯的方法并不对。
于是看了题解,恍然大悟。
0-1背包问题:
有n个物体和一个背包,将n个物体中的若干个物体放入背包。每个物体只能放1次,即每个物体都是要么放,要么不放。
对应这道题就是,n个物体中选若干个放入一个大小为target的背包,能否刚好装满。
定义一个数组dp[n][target+1],dp[i][j]表示能否从前[0,i]个数中选取若干个使其和刚好为j。最终dp[n-1][target]即为所求。采用了动态规划的思想。
因为每一个物体都可放可不放,所以就有了分类讨论,即得到状态转移方程。
如果j=