2017.9.6.
题目真的是越来越难了呢,很多思路我完全没有。别人的思路和代码也是勉勉强强可以看懂,但是自己是完全写不出来那么巧妙的思路的。
这个题目加收藏了,一定还是要好好琢磨的。
public class Solution {
/**
* @param nums a non-empty array only positive integers
* @return return true if can partition or false
*/
public boolean canPartition(int[] nums) {
// Write your code here
int length = nums.length;
if(length <= 1){
return false;
}
int sum = 0;
for(int num : nums){
sum += num;
}
if(sum%2 == 1){
return false;
}
sum /= 2;
boolean []dp = new boolean[sum + 1];
//dp【i】用来表示,数组中是否存在 和为 i 的子集合。
//状态转移,感觉真是巧妙啊。
dp[0] = true;
for(int i = 0; i < length; i++){
for(int j = sum; j>= nums[i]; j--){
dp[j] = dp[j] || dp[j - nums[i]];
}
}
return dp[sum];
}
}
本文探讨了一道难度较高的子集划分问题,并提供了一个简洁的Java解决方案。通过对问题的深入剖析,采用动态规划的方法判断一个整数数组是否可以被划分为两个子集,使得每个子集的元素之和相等。
1455

被折叠的 条评论
为什么被折叠?



