Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

[pull] master from youngyangyang04:master #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
pull merged 26 commits into AlgorithmAndLeetCode:master from youngyangyang04:master
May 27, 2022
Merged
Changes from 1 commit
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
21475ad
修正了其中一个错别字
languagege May 9, 2022
7519826
Update 0019.删除链表的倒数第N个节点.md
qingfengpiaoa May 10, 2022
c62d518
fix bug
FizzerYu May 10, 2022
d92aa2c
Add 0112.路径总和.md C语言解法
KingArthur0205 May 10, 2022
cc2c2ad
添加 0977.有序数组的平方.md Scala版本
wzqwtt May 11, 2022
842c042
添加(背包问题理论基础多重背包.md):增加typescript版本
xiaofei-2020 May 11, 2022
871d96a
添加 0209.长度最小的子数组.md Scala版本
wzqwtt May 11, 2022
cb2fea6
添加 0113.路径总和II C语言解法
KingArthur0205 May 11, 2022
c363e9d
添加(0198.打家劫舍.md):增加typescript版本
xiaofei-2020 May 11, 2022
2964855
添加(0213.打家劫舍II.md):增加typescript版本
xiaofei-2020 May 11, 2022
1e9bb56
Merge branch 'youngyangyang04:master' into master
KingArthur0205 May 14, 2022
5da6c06
添加 背包理论肌醇01背包 C语言版本
KingArthur0205 May 14, 2022
4defb3d
Merge branch 'master' of https://github.com/KingArthur0205/leetcode-m...
KingArthur0205 May 14, 2022
a20ac9d
Merge branch 'youngyangyang04:master' into master
KingArthur0205 May 15, 2022
aa22b80
添加 背包理论基础01-2.mc C语言版本
KingArthur0205 May 15, 2022
d15c4af
Merge branch 'master' of https://github.com/KingArthur0205/leetcode-m...
KingArthur0205 May 15, 2022
19abe18
添加 0416.分割等和子集.md C语言版本
KingArthur0205 May 15, 2022
4f94d8a
Merge pull request #1296 from languagege/master
youngyangyang04 May 27, 2022
b4a40a2
Merge pull request #1298 from qingfengpiaoa/master
youngyangyang04 May 27, 2022
5719c00
Merge pull request #1301 from FizzerYu/patch-1
youngyangyang04 May 27, 2022
45a8a6b
Merge branch 'master' into master
youngyangyang04 May 27, 2022
309643e
Merge pull request #1302 from KingArthur0205/master
youngyangyang04 May 27, 2022
7684a1c
Merge pull request #1304 from xiaofei-2020/dp27
youngyangyang04 May 27, 2022
f115be0
Merge pull request #1305 from ZongqinWang/patch01
youngyangyang04 May 27, 2022
bb32a41
Merge pull request #1306 from xiaofei-2020/dp29
youngyangyang04 May 27, 2022
0e3a1bc
Merge pull request #1307 from xiaofei-2020/dp30
youngyangyang04 May 27, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
添加 0416.分割等和子集.md C语言版本
  • Loading branch information
KingArthur0205 committed May 15, 2022
commit 19abe18019814af74ee51ba56e4e8ee6106b1253
100 changes: 100 additions & 0 deletions problems/0416.分割等和子集.md
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,106 @@ var canPartition = function(nums) {
};
```

C:
二维dp:
```c
/**
1. dp数组含义:dp[i][j]为背包重量为j时,从[0-i]元素和最大值
2. 递推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i])
3. 初始化:dp[i][0]初始化为0。因为背包重量为0时,不可能放入元素。dp[0][j] = nums[0],当j >= nums[0] && j < target时
4. 遍历顺序:先遍历物品,再遍历背包
*/
#define MAX(a, b) (((a) > (b)) ? (a) : (b))

int getSum(int* nums, int numsSize) {
int sum = 0;

int i;
for(i = 0; i < numsSize; ++i) {
sum += nums[i];
}
return sum;
}

bool canPartition(int* nums, int numsSize){
// 求出元素总和
int sum = getSum(nums, numsSize);
// 若元素总和为奇数,则不可能得到两个和相等的子数组
if(sum % 2)
return false;

// 若子数组的和等于target,则nums可以被分割
int target = sum / 2;
// 初始化dp数组
int dp[numsSize][target + 1];
// dp[j][0]都应被设置为0。因为当背包重量为0时,不可放入元素
memset(dp, 0, sizeof(int) * numsSize * (target + 1));

int i, j;
// 当背包重量j大于nums[0]时,可以在dp[0][j]中放入元素nums[0]
for(j = nums[0]; j <= target; ++j) {
dp[0][j] = nums[0];
}

for(i = 1; i < numsSize; ++i) {
for(j = 1; j <= target; ++j) {
// 若当前背包重量j小于nums[i],则其值等于只考虑0到i-1物品时的值
if(j < nums[i])
dp[i][j] = dp[i - 1][j];
// 否则,背包重量等于在背包中放入num[i]/不放入nums[i]的较大值
else
dp[i][j] = MAX(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i]);
}
}
// 判断背包重量为target,且考虑到所有物品时,放入的元素和是否等于target
return dp[numsSize - 1][target] == target;
}
```
滚动数组:
```c
/**
1. dp数组含义:dp[j]为背包重量为j时,其中可放入元素的最大值
2. 递推公式:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
3. 初始化:均初始化为0即可
4. 遍历顺序:先遍历物品,再后序遍历背包
*/
#define MAX(a, b) (((a) > (b)) ? (a) : (b))

int getSum(int* nums, int numsSize) {
int sum = 0;

int i;
for(i = 0; i < numsSize; ++i) {
sum += nums[i];
}
return sum;
}

bool canPartition(int* nums, int numsSize){
// 求出元素总和
int sum = getSum(nums, numsSize);
// 若元素总和为奇数,则不可能得到两个和相等的子数组
if(sum % 2)
return false;
// 背包容量
int target = sum / 2;

// 初始化dp数组,元素均为0
int dp[target + 1];
memset(dp, 0, sizeof(int) * (target + 1));

int i, j;
// 先遍历物品,后遍历背包
for(i = 0; i < numsSize; ++i) {
for(j = target; j >= nums[i]; --j) {
dp[j] = MAX(dp[j], dp[j - nums[i]] + nums[i]);
}
}

// 查看背包容量为target时,元素总和是否等于target
return dp[target] == target;
}
```



Expand Down

AltStyle によって変換されたページ (->オリジナル) /