@@ -134,17 +134,17 @@ x = (target + sum) / 2
134134
135135大家看到(target + sum) / 2 应该担心计算的过程中向下取整有没有影响。
136136
137- 这么担心就对了,例如sum 是5,S是2的话其实就是无解的 ,所以:
137+ 这么担心就对了,例如sum是5,target是2 的话其实就是无解的 ,所以:
138138
139139```CPP
140140(C++代码中,输入的S 就是题目描述的 target)
141- if ((S + sum) % 2 == 1) return 0; // 此时没有方案
141+ if ((target + sum) % 2 == 1) return 0; // 此时没有方案
142142```
143143
144- 同时如果 S的绝对值已经大于sum,那么也是没有方案的。
144+ 同时如果target 的绝对值已经大于sum,那么也是没有方案的。
145+
145146``` CPP
146- (C++代码中,输入的S 就是题目描述的 target)
147- if (abs(S) > sum) return 0 ; // 此时没有方案
147+ if (abs(target) > sum) return 0 ; // 此时没有方案
148148```
149149
150150再回归到01背包问题,为什么是01背包呢?
@@ -213,9 +213,9 @@ dp[j]其他下标对应的数值也应该初始化为0,从递推公式也可
213213
2142145 . 举例推导dp数组
215215
216- 输入:nums: [ 1, 1, 1, 1, 1] , S : 3
216+ 输入:nums: [ 1, 1, 1, 1, 1] , target : 3
217217
218- bagSize = (S + sum) / 2 = (3 + 5) / 2 = 4
218+ bagSize = (target + sum) / 2 = (3 + 5) / 2 = 4
219219
220220dp数组状态变化如下:
221221
@@ -226,12 +226,12 @@ C++代码如下:
226226``` CPP
227227class Solution {
228228public:
229- int findTargetSumWays(vector<int >& nums, int S ) {
229+ int findTargetSumWays(vector<int >& nums, int target ) {
230230 int sum = 0;
231231 for (int i = 0; i < nums.size(); i++) sum += nums[ i] ;
232- if (abs(S ) > sum) return 0; // 此时没有方案
233- if ((S + sum) % 2 == 1) return 0; // 此时没有方案
234- int bagSize = (S + sum) / 2;
232+ if (abs(target ) > sum) return 0; // 此时没有方案
233+ if ((target + sum) % 2 == 1) return 0; // 此时没有方案
234+ int bagSize = (target + sum) / 2;
235235 vector<int > dp(bagSize + 1, 0);
236236 dp[ 0] = 1;
237237 for (int i = 0; i < nums.size(); i++) {
@@ -655,3 +655,52 @@ public class Solution
655655<a href =" https://programmercarl.com/other/kstar.html " target =" _blank " >
656656 <img src =" ../pics/网站星球宣传海报.jpg " width =" 1000 " />
657657</a >
658+
659+
660+ class Solution {
661+ public:
662+ int findTargetSumWays(vector<int >& nums, int target) {
663+ int sum = 0;
664+ for (int i = 0; i < nums.size(); i++) sum += nums[ i] ;
665+ if (abs(target) > sum) return 0; // 此时没有方案
666+ if ((target + sum) % 2 == 1) return 0; // 此时没有方案
667+ int bagSize = (target + sum) / 2;
668+
669+ vector<vector<int>> dp(nums.size(), vector<int>(bagSize + 1, 0));
670+
671+ if (nums[0] <= bagSize) dp[0][nums[0]] = 1;
672+
673+ dp[0][0] = 1;
674+
675+ int numZero = 0;
676+ for (int i = 0; i < nums.size(); i++) {
677+ if (nums[i] == 0) numZero++;
678+ dp[i][0] = (int) pow(2.0, numZero);
679+ }
680+
681+ for (int i = 1; i < nums.size(); i++) {
682+ for (int j = 0; j <= bagSize; j++) {
683+ if (nums[i] > j) dp[i][j] = dp[i - 1][j];
684+ else dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]];
685+ }
686+ }
687+ for (int i = 0; i < nums.size(); i++) {
688+ for (int j = 0; j <= bagSize; j++) {
689+ cout << dp[i][j] << " ";
690+ }
691+ cout << endl;
692+ }
693+ return dp[nums.size() - 1][bagSize];
694+ }
695+ };
696+
697+ 1 1 0 0 0
698+ 1 2 1 0 0
699+ 1 3 3 1 0
700+ 1 4 6 4 1
701+ 1 5 10 10 5
702+
703+ 初始化 如果没有0, dp[ i] [ 0 ] = 1; 即所有元素都不取。
704+
705+ 用元素 取与不取来举例
706+
0 commit comments