动态规划:分割等和子集(01背包问题)

//本题目可以转换为:容量为num/2的背包,这n个物品的体积和价值都相等,求dp[sum/2]是否等于sum/2
class Solution {
   public boolean canPartition(int[] nums) {
        int target=0;
        for (int num : nums) {
            target+=num;
        }
        if (target%2!=0) return false;
        target/=2;
        int []dp=new int[target+1];
        Arrays.fill(dp,0);
        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;
        else return false;
    }
}
//当dp[target]=target,说明在sum/2的容量下,里面的数字之和刚好也为sum/2
//01背包不仅能解决最大价值问题,还可以解决能否装满背包的问题
全部评论

相关推荐

肖先生~:大一点得到公司面试更能学到点东西
点赞 评论 收藏
分享
明明就不饿:看不懂你到底会啥,什么岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务