动态规划part04 01背包问题(二维法和一维法) 416.分割等和子集
01背包问题
二维法(acm可运行答案)
# include <iostream>
# include <vector>
using namespace std;
int Solution ( vector< int > & space, vector< int > & value, int N) {
vector< vector< int >> dp ( space. size ( ) , vector < int > ( N+ 1 ) ) ;
for ( int i = 0 ; i< dp. size ( ) ; i++ ) {
dp[ i] [ 0 ] = 0 ;
}
for ( int j = 0 ; j< dp[ 0 ] . size ( ) ; j++ ) {
if ( j >= space[ 0 ] ) dp[ 0 ] [ j] = value[ 0 ] ;
}
for ( int i = 1 ; i < dp. size ( ) ; i++ ) {
for ( int j = 1 ; j < dp[ 0 ] . size ( ) ; j++ ) {
if ( j< space[ i] ) dp[ i] [ j] = dp[ i- 1 ] [ j] ;
else dp[ i] [ j] = max ( dp[ i- 1 ] [ j] , dp[ i- 1 ] [ j - space[ i] ] + value[ i] ) ;
}
}
return dp[ space. size ( ) - 1 ] [ N] ;
}
int main ( ) {
size_t M, N;
cin>> M>> N;
vector< int > space ( M) ;
vector< int > value ( M) ;
for ( int i = 0 ; i < space. size ( ) ; i++ ) {
cin >> space[ i] ;
}
for ( int j = 0 ; j < value. size ( ) ; j++ ) {
cin >> value[ j] ;
}
std:: cout << Solution ( space, value, N) << std:: endl;
return 0 ;
}
一维法(acm可运行答案)
# include <iostream>
# include <vector>
using namespace std;
int Solution ( vector< int > & space, vector< int > & value, int N) {
vector< int > dp ( N+ 1 , 0 ) ;
dp[ 0 ] = 0 ;
for ( int i = 0 ; i < space. size ( ) ; i++ ) {
for ( int j = N; j>= space[ i] ; j-- ) {
dp[ j] = max ( dp[ j] , dp[ j - space[ i] ] + value[ i] ) ;
}
}
return dp[ N] ;
}
int main ( ) {
size_t M, N;
cin>> M>> N;
vector< int > space ( M) ;
vector< int > value ( M) ;
for ( int i = 0 ; i < space. size ( ) ; i++ ) {
cin >> space[ i] ;
}
for ( int j = 0 ; j < value. size ( ) ; j++ ) {
cin >> value[ j] ;
}
std:: cout << Solution ( space, value, N) << std:: endl;
return 0 ;
}
class Solution {
public :
bool canPartition ( vector< int > & nums) {
int sum = 0 ;
for ( int i = 0 ; i < nums. size ( ) ; i++ ) {
sum += nums[ i] ;
}
if ( sum% 2 != 0 ) return false ;
int bagWeight = sum / 2 ;
vector< int > dp ( bagWeight+ 1 , 0 ) ;
for ( int i = 0 ; i < nums. size ( ) ; i++ ) {
for ( int j = bagWeight; j >= nums[ i] ; j-- ) {
dp[ j] = max ( dp[ j] , dp[ j- nums[ i] ] + nums[ i] ) ;
}
}
if ( dp[ bagWeight] == bagWeight) return true ;
else return false ;
}
} ;