1049. 最后一块石头的重量 II
题目
思路与解法
class Solution {
public : int lastStoneWeightII ( vector< int > & stones) { int sum = 0 ; for ( int i= 0 ; i< stones. size ( ) ; i++ ) { sum += stones[ i] ; } int target = sum/ 2 ; vector< int > dp ( target+ 1 , 0 ) ; for ( int i= stones[ 0 ] ; i < dp. size ( ) ; i++ ) { dp[ i] = stones[ 0 ] ; } for ( int j= 1 ; j< stones. size ( ) ; j++ ) { for ( int i= target; i>= 0 ; i-- ) { if ( i>= stones[ j] ) { dp[ i] = max ( dp[ i] , dp[ i- stones[ j] ] + stones[ j] ) ; } } } return sum- dp[ target] - dp[ target] ; }
} ;
494. 目标和
题目
思路与解法
class Solution {
public : int findTargetSumWays ( vector< int > & nums, int target) { int sum = 0 ; for ( int i= 0 ; i< nums. size ( ) ; i++ ) sum += nums[ i] ; int left = ( sum+ target) / 2 ; if ( ( sum+ target< 0 ) || ( sum+ target) % 2 == 1 ) return 0 ; vector< int > dp ( left + 1 , 0 ) ; dp[ 0 ] = 1 ; for ( int i = 0 ; i< nums. size ( ) ; i++ ) { for ( int j = dp. size ( ) - 1 ; j>= nums[ i] ; j-- ) { dp[ j] = dp[ j- nums[ i] ] + dp[ j] ; } } return dp[ left] ; }
} ;
474.一和零
题目
思路与解法
class Solution {
public : int findMaxForm ( vector< string> & strs, int m, int n) { vector< vector< int >> dp ( m+ 1 , vector < int > ( n+ 1 , 0 ) ) ; dp[ 0 ] [ 0 ] = 0 ; for ( int k = 0 ; k< strs. size ( ) ; k++ ) { int count0 = std:: count ( strs[ k] . begin ( ) , strs[ k] . end ( ) , '0' ) ; int count1 = std:: count ( strs[ k] . begin ( ) , strs[ k] . end ( ) , '1' ) ; for ( int i = m; i>= count0; i-- ) { for ( int j = n; j>= count1; j-- ) { dp[ i] [ j] = max ( dp[ i- count0] [ j- count1] + 1 , dp[ i] [ j] ) ; } } } return dp[ m] [ n] ; }
} ;