今日记录
背包问题0-1
Karma链接
#include <bits/stdc++.h>
using namespace std;
int n,bagweight;
void solve(){
vector<int> weight(n,0);
vector<int> value(n,0);
for(int i=0;i<n;i++){
cin>>weight[i];
}
for(int j=0;j<n;j++){
cin>>value[j];
}
vector<vector<int>> dp(weight.size(),vector<int>(bagweight+1,0));
for(int j=weight[0];j<=bagweight;j++){
dp[0][j]=value[0];
}
for(int i=1;i<weight.size();i++){
for(int j=0;j<=bagweight;j++){
if(j<weight[i]) dp[i][j]=dp[i-1][j];
else dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);
}
}
cout<<dp[weight.size()-1][bagweight]<<endl;
}
int main(){
while(cin>>n>>bagweight){
solve();
}
return 0;
}
背包问题0-1 Ⅱ
#include <iostream>
#include <vector>
using namespace std;
int main() {
int M, N;
cin >> M >> N;
vector<int> costs(M);
vector<int> values(M);
for (int i = 0; i < M; i++) {
cin >> costs[i];
}
for (int j = 0; j < M; j++) {
cin >> values[j];
}
vector<int> dp(N + 1, 0);
for (int i = 0; i < M; ++i) {
for (int j = N; j >= costs[i]; --j) {
dp[j] = max(dp[j], dp[j - costs[i]] + values[i]);
}
}
cout << dp[N] << endl;
return 0;
}
416.分割等和子集
Leetcode链接
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
vector<int> dp(10001, 0);
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
}
if (sum % 2 == 1)
return false;
int target = sum / 2;
for (int i = 0; i < nums.size(); i++) {
for (int j = target; j >= nums[i]; j--) {
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
}
}
if (dp[target] == target)
return true;
return false;
}
};
总结