如何做微信网站前端好学吗需要学多久
如何做微信网站,前端好学吗需要学多久,专业网站制作咨询,北京网站改版报价在本题中#xff0c;我们是要把一个数组#xff0c;分割成两个子集#xff0c;并且两个子集的元素和相等。那么也就是说#xff0c;两个子集的和是相等的#xff0c;并且都是整个数组的一半。那我们考虑这是一个01背包问题#xff0c;物品的价值和物品的质量一样#xf… 在本题中我们是要把一个数组分割成两个子集并且两个子集的元素和相等。那么也就是说两个子集的和是相等的并且都是整个数组的一半。那我们考虑这是一个01背包问题物品的价值和物品的质量一样就是数组的元素。我们把这个数组的元素放入容量为数组和一半的背包中如果能刚好放下则证明可以分割如果不可以则证明分割不了。所以我们采用动态规划来做。
抽象成背包问题之后直接套用背包公式的模板。本题采用一维数组来做。 dp[j]表示容量为j的背包它的价值为dp[j]。
递推公式就是dp[j] Math.max(dp[j]dp[j-weight[i]values[i]])。此时weight[]与values[]都一样就是nums[]
初始化我们要考虑我们取的是最大值也就是每次递推我们取两个元素的最大值dp[0]表示容量为0此时价值也为0其他位置我们也取0即可在正整数取最大值的时候可以直接覆盖。
遍历顺序01背包一维数组遍历顺序应该先遍历物品再遍历背包并且背包需要倒叙遍历。
遍历数组
class Solution {public boolean canPartition(int[] nums) {if(nums null || nums.length 0) return false;int n nums.length;int sum 0;for(int num : nums) {sum num;}//总和为奇数不能平分if(sum % 2 ! 0) return false;int target sum / 2;int[] dp new int[target 1];for(int i 0; i n; i) {for(int j target; j nums[i]; j--) {//物品 i 的重量是 nums[i]其价值也是 nums[i]dp[j] Math.max(dp[j], dp[j - nums[i]] nums[i]);}//剪枝一下每一次完成內層的for-loop立即檢查是否dp[target] target優化時間複雜度26ms - 20msif(dp[target] target)return true;}return false;}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/91218.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!