class Solution {
public int findTargetSumWays(int[] nums, int target) {
int sum = 0;
for(int temp : nums){
sum += temp;
}
int[] weight = nums;
int[] value = nums;
if(sum < Math.abs(target)){
return 0;
}
if((target + sum)%2 != 0){
return 0;
}
int bagsize = (target + sum)/2;
int[][] dp = new int[weight.length][bagsize+1];
//用物品0填满容量为0的背包只有1中方式,那就是啥也不放
dp[0][0] = 1;
//用物品0填满不同容量的背包,注意是填满,只有当背包容量刚好=物品重量的时候才能填满
//注意此处的初始化和最大value的不同之处
for(int j = 0; j <= bagsize; j++){
if(j == weight[0]){
dp[0][j] = 1;
}
}
//初始化左列,其中填满容量为0的背包,如果没有0,那就是1,
//如果有很多0,每个0都可以取+ -两种方式,0的个数有n个,所以有2的n次方填满0
int zeroNum = 0;
for(int i = 0; i < weight.length; i++){
if(weight[i] == 0){
zeroNum++;
}
dp[i][0] = (int)Math.pow(2, zeroNum);
}
for(int i = 1; i < weight.length; i++){
for(int j = 1; j <= bagsize; j++){
if(weight[i] > j){
dp[i][j] = dp[i-1][j];
}else{
// dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]);
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - weight[i]];
}
}
}
for(int i = 0; i < weight.length; i++){
for(int j = 0; j <= bagsize; j++){
System.out.print(dp[i][j] + " ");
}
System.out.println(" ");
}
return dp[weight.length-1][bagsize];
}
}
目标和 二维
最新推荐文章于 2024-07-19 19:11:19 发布