mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-11 04:54:51 +08:00
Merge pull request #753 from X-shuffle/master
添加 0474.一和零 (三维数组,动态规划,好理解)Go语言版本
This commit is contained in:
@ -248,6 +248,53 @@ func max(a,b int) int {
|
|||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
> 传统背包,三维数组法
|
||||||
|
```golang
|
||||||
|
func findMaxForm(strs []string, m int, n int) int {
|
||||||
|
//dp的第一个index代表项目的多少,第二个代表的是背包的容量
|
||||||
|
//所以本处项目的多少是len(strs),容量为m和n
|
||||||
|
dp:=make([][][]int,len(strs)+1)
|
||||||
|
for i:=0;i<=len(strs);i++{
|
||||||
|
//初始化背包容量
|
||||||
|
strDp:=make([][]int,m+1)
|
||||||
|
for j:=0;j<m+1;j++{
|
||||||
|
tmp:=make([]int,n+1)
|
||||||
|
strDp[j]=tmp
|
||||||
|
}
|
||||||
|
dp[i]=strDp
|
||||||
|
}
|
||||||
|
for k,value:=range strs{
|
||||||
|
//统计每个字符串0和1的个数
|
||||||
|
var zero,one int
|
||||||
|
for _,v:=range value{
|
||||||
|
if v=='0'{
|
||||||
|
zero++
|
||||||
|
}else{
|
||||||
|
one++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
k+=1
|
||||||
|
//计算dp
|
||||||
|
for i:=0;i<=m;i++{
|
||||||
|
for j:=0;j<=n;j++{
|
||||||
|
//如果装不下
|
||||||
|
dp[k][i][j]=dp[k-1][i][j]
|
||||||
|
//如果装的下
|
||||||
|
if i>=zero&&j>=one{
|
||||||
|
dp[k][i][j]=getMax(dp[k-1][i][j],dp[k-1][i-zero][j-one]+1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[len(strs)][m][n]
|
||||||
|
}
|
||||||
|
func getMax(a,b int)int{
|
||||||
|
if a>b{
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
Javascript:
|
Javascript:
|
||||||
```javascript
|
```javascript
|
||||||
|
@ -314,6 +314,47 @@ func findTargetSumWays(nums []int, target int) int {
|
|||||||
return dp[bag]
|
return dp[bag]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
> 更新版,上一个跑不通了,因为会存在bag 小于0的情况
|
||||||
|
|
||||||
|
```go
|
||||||
|
func findTargetSumWays(nums []int, target int) int {
|
||||||
|
//先转化为数学问题
|
||||||
|
//a-b=target
|
||||||
|
//a+b=sum
|
||||||
|
//a=(target+sum)/2
|
||||||
|
//求出sum
|
||||||
|
var sum int
|
||||||
|
for _,value:=range nums{
|
||||||
|
sum+=value
|
||||||
|
}
|
||||||
|
//如果sum<target或者 sum+target不是偶数(因为a是int) 或者两者之和小于0了
|
||||||
|
if sum<target||(sum+target)%2==1||(sum+target)<0{
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
//开始dp初始化
|
||||||
|
dp:=make([][]int,len(nums)+1)
|
||||||
|
for i:=0;i<=len(nums);i++{
|
||||||
|
tmp:=make([]int,(target+sum)/2+1)//背包容量
|
||||||
|
dp[i]=tmp
|
||||||
|
}
|
||||||
|
dp[0][0]=1//当背包容量为0,且物品为0时,填满背包就1种方法
|
||||||
|
for i:=0;i<len(nums)+1;i++{
|
||||||
|
if i==0{
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for j:=0;j<(target+sum)/2+1;j++{
|
||||||
|
if nums[i-1]<=j{//如果背包装的下
|
||||||
|
dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i-1]]
|
||||||
|
}else{
|
||||||
|
dp[i][j]=dp[i-1][j]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[len(nums)][(target+sum)/2]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Javascript:
|
Javascript:
|
||||||
```javascript
|
```javascript
|
||||||
|
Reference in New Issue
Block a user