题目:
思路:
首先这道题要转化为01背包的模型是难点,
这样我们就可以把sumA求出来,sumA表示这个数组中附加号的数相加的值,相当于这道题就转化为已知每个物品的重量,背包只能放sumA的容量,要怎么放才能让背包容量刚刚好等于sumA。
按照01背包的正常思路:dp[i][j]表示前i个数装满背包总容量为j总共有多少方法。
有两种情况:
①j<nums[i-1]时,表示第i个数不能装进背包,背包容量还有j,则dp[i][j]=dp[i-1][j];
②其他情况下,dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i-1]];
初始化:如下
为什么j=0的那一列不能直接初始化,如果是dp[2][0],数组为[1,1,1,1,1],是不是有两种方法使target=0;-1+1 or +1-1 所以不能轻易直接初始化。
代码:
int findTargetSumWays(int* nums, int numsSize, int target){
int sum=0;
int i,j;
for(i=0;i<numsSize;i++){
sum+=nums[i];
}
int bagSize=(sum+target)/2;//bagSize=4
if(bagSize<0){
bagSize=-bagSize;
}
if((sum+target)%2!=0||sum<target||sum<-target){
return 0;
}
int dp[numsSize+1][bagSize+1];
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(i=1;i<=numsSize;i++){
for(j=0;j<=bagSize;j++){
if(j>=nums[i-1]){
dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i-1]];
}
else{
dp[i][j]=dp[i-1][j];
}
}
}
return dp[numsSize][bagSize];
}