动态规划part04 01背包问题(二维法和一维法) 416.分割等和子集
01背包问题
二维法(acm可运行答案)
#include
#include
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
#include
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;
}
416. 分割等和子集
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;
}
};