刷題第十九天
416. 分割等和子集:
這題可以轉(zhuǎn)化為背包問(wèn)題,先算出nums的總和,如果總和為奇數(shù),返回false,否則總和的一半就是背包的容量target。dp[i][j]指在0-i中任取num,和小于等于j。最后返回target==dp[nums.size()-1][target]。
這里我用了一個(gè)dp小技巧,在nums前插入一個(gè)0,之后i從1開(kāi)始遍歷,這樣做就不用對(duì)dp進(jìn)行初始化。

1049. 最后一塊石頭的重量 II:
這題其實(shí)就是算出最接近平均值的和與平均值差多少,差的兩倍就是答案。這樣理解之后,解題思路就和416是一樣的。

494. 目標(biāo)和:
這題的背包就是sum-target再除2,如果背包不是整數(shù)或?yàn)樨?fù)數(shù),返回0。dp[i][j]指當(dāng)前0-i中任選和為j的方法數(shù)。初始化當(dāng)nums[0]==j時(shí)dp[0][j]++,再dp[0][0]++。然后遍歷,dp[i][j]+=dp[i-1][j],dp[i][j]+=dp[i-1][j-nums[i]]。

474. 一和零:
這題首先要處理字符串,設(shè)置one和zero數(shù)組。設(shè)置了三維dp[i][j][k]表示0-i中選任意字符串,其中的0和1個(gè)數(shù)分別不超過(guò)j和k的最長(zhǎng)組合。這題初始化和494是一個(gè)思路。
標(biāo)簽: