416.分割等和子集
public class Solution {public bool CanPartition(int[] nums) {int[] dp=new int[10001];int sum=0;for(int i=0;i<nums.Length;i++){sum+=nums[i];}if(sum%2==1){return false;}int target=sum/2;for(int i=0;i<nums.Length;i++){for(int j=target;j>=nums[i];j--){dp[j]=Math.Max(dp[j],dp[j-nums[i]]+nums[i]);}}if(dp[target]==target){return true;}return false;}
}
首先要确定的是一个数只能用一次所以使用01背包问题,要想使两个数组的和相同那Nums数组一定要是偶数和才行,其次要找到偶数和的一班作为背包的Target,也就是01背包的最大价值,其中内层要采用倒序才能避免重复相加,在一维数组的基础上稍作修改,Dp[j]=Math.Max(Dp[j],Dp[j-Nums[i]]+Nums[i])最终判断DP数组是否为Target是的话则成功。