这道题第一想法是用回溯,但是容易超时。
第二种是转换为0-1背包问题
//若负数的和为neg,则整数的和为sum-neg
//按题目要求target = (sum-neg)-neg,转换为neg = (sum-tar)/2
//dp[i][j]表示前i个元素,凑出和为j的方案数目
//当i=0,j=0时方案数dp[0][0]=1,j>0时,dp[i][j]=0;
//其余情况中,j<num时,dp[i][j]=dp[i-1][j];j>=num时,dp[i][j] = dp[i-1][j]+dp[i-1][j-num]
还要注意一点就是,由于数组 nums中的元素都是非负整数,neg也必须是非负整数,所以上式成立的前提是 sum−target是非负偶数。若不符合该条件可直接返回 0。
同样是转换为0-1背包问题,背包的容量是sum/2,越接近这个值,最后剩下的石头重量越低,是res = sum - 2*dp[len][mid]