知识点:动态规划
对于动态规划类的题目,最关键的一步是找到状态转移方程,如何由前一状态转换为下一状态,题目要求找出元素和相同的两部分,也就是要找到一个和为总和一半的子序列。我们可以定义dp[i][j],代表前i个元素是否能组成和为j的子序列,对于当前状态<i, j>来说,可以由上一状态转换而来,若dp[i - 1][j] == true,则当前状态下dp[i][j]=true,或者说dp[i - 1][j - nums[i]] == ture,也就是加上当前位置的元素后,也可以组成和为j,即dp[i][j]=true。最终状态dp[n][sum/2]即为答案。
Java题解如下
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param weights int整型一维数组
* @return bool布尔型
*/
public boolean canPartition (int[] weights) {
// write code here
int n = weights.length;
int sum = Arrays.stream(weights).sum();
if(sum % 2 != 0) {
return false;
}
int target = sum / 2;
boolean[][] dp = new boolean[n + 1][target + 1];
for(int i = 0; i <= n; i++) {
dp[i][0] = true;
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= target; j++) {
dp[i][j] = dp[i - 1][j];
if(j >= weights[i - 1]) {
dp[i][j] = dp[i][j] || dp[i - 1][j - weights[i - 1]];
}
}
}
return dp[n][target];
}
}



京公网安备 11010502036488号