class Solution {
public int findTargetSumWays(int[] nums, int target) {
//将数分为负数集与正数级,target = 正数集 - 负数集,总的值为sum = 正数集 + 负数集
//转为有一些物品,第 i 个物品的重量为 nums[i] , 背包的容量为(sum + target) / 2 ,有多少种方式将背包恰好填满
//一旦正数集合确定,负数集合是剩下的数字,并且表达式 left - right的结果必定等于 target。
int sum = 0;
for (int num : nums) {
sum += num;
}
//背包容量 前几个商品
int m = nums.length;
int n = (sum + target) / 2;
if (n < 0) return 0;
if ((target + sum) % 2 == 1) return 0;
int[][] dp = new int[m+1][n+1];
for(int i = 0;i <= n;i++){
dp[0][i] = 0;
}
for(int i = 0;i <= m;i++){
dp[i][0] = 1;
}
for(int i = 1;i <= m;i++){
for(int j = 0;j <= n;j++){
if(j < nums[i - 1]){
dp[i][j] = dp[i - 1][j];
}else{
// 不选当前数字nums[i-1]时,仅用前i-1个数字凑出目标和j的方法数加上选定当前数字 nums[i-1]后,用前i-1个数字去凑出剩余目标 j - nums[i-1]的方法数
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i - 1]];
}
}
}
return dp[m][n];
}
}
目标和
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 摘要 用动态规划解决问题时,不仅要从简单的子问题来考虑递推公式,也要从问题的整体来考虑,看问题的输入参数本身有什么...
- 1049. 最后一块石头的重量 II[https://leetcode.cn/problems/last-ston...
- 最后一块石头的重量 II 力扣题目链接[https://leetcode.cn/problems/last-sto...
- 474. 一和零 题目链接:474. 一和零[https://leetcode.cn/problems/ones-...
- 01背包理论基础 解法一:暴力解法:每种物品有取/不取两种状态。时间复杂度:O(2n)解法二:动态规划: 二维数...