** 01背包问题 二维 **
01背包问题 二维
https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html
视频讲解:https://www.bilibili.com/video/BV1cg411g7Y6
#include <bits/stdc++.h>
using namespace std;
int n, bag_weight;
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>(bag_weight+1,0));
for(int j=weight[0];j<=bag_weight;j++) {
dp[0][j] = value[0];
}
for(int i=1;i<weight.size();i++) {
for(int j=0;j<=bag_weight;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][bag_weight]<<endl;
}
int main() {
while(cin>>n>>bag_weight) {
solve();
}
return 0;
}
**01背包问题 一维 **
01背包问题 一维
https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-2.html
视频讲解:https://www.bilibili.com/video/BV1BU4y177kY
// 一维dp数组实现
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 读取 M 和 N
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];
}
// 创建一个动态规划数组dp,初始值为0
vector<int> dp(N + 1, 0);
// 外层循环遍历每个类型的研究材料
for (int i = 0; i < M; ++i) {
// 内层循环从 N 空间逐渐减少到当前研究材料所占空间
for (int j = N; j >= costs[i]; --j) {
// 考虑当前研究材料选择和不选择的情况,选择最大值
dp[j] = max(dp[j], dp[j - costs[i]] + values[i]);
}
}
// 输出dp[N],即在给定 N 行李空间可以携带的研究材料最大价值
cout << dp[N] << endl;
return 0;
}
本题是 01背包的应用类题目
https://programmercarl.com/0416.%E5%88%86%E5%89%B2%E7%AD%89%E5%92%8C%E5%AD%90%E9%9B%86.html
视频讲解:https://www.bilibili.com/video/BV1rt4y1N7jE
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循环在外层
//遍历背包在内层,倒序遍历
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;
}
};