Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.
Note:
Each of the array element will not exceed 100.
The array size will not exceed 200.
给定一个数组,问,有没有一种分法,将数组分成两个和相等的部分。
思路:
1.即在数组中查找一些数字,和为总和的一半。
2.如果总和为奇数,则不可能分成题目要求。
3.接下来是算法的核心。
4.以前做法:将从小到大排序,两个数组一边放一个的原则。总和小的那个数组得到即将要分配的数。但是这样往往得不到最优解。需要考虑到的细节,优化点太多。
5.动态规划中的背包0-1问题。
代码如下 :
function canPartition(nums){
var sum = 0;
var result = [];
if(!nums || nums.length<2){return false;}
nums.map(function(a){sum+=a});
console.log(sum);
if(sum%2){return false;}
sum /= 2;
result[0] = true;
for(var i=1; i<=nums.length; i++){
for(var j=sum; j>=nums[i-1];j--){
result[j] = (result[j] || result[j-nums[i-1]])?true:false;
}
// console.log(result.map(function(a){return a?" true":"false"}).toString());
}
return result[sum];
}