0-1背包
二维
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int m, n;
cin >> m >> n;
vector<int> weight(m + 1, 0);
vector<int> value(m + 1, 0);
for (int i = 0; i < m; i++)
{
cin >> weight[i];
}
for (int i = 0; i < m; i++)
{
cin >> value[i];
}
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
for (int i = weight[0]; i <= n; i++)
{
dp[0][i] = value[0];
}
for (int i = 1; i < m; i++)
{
for (int j = 1; j <= n; 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[m - 1][n];
return 0;
}
一维
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int m, n;
cin >> m >> n;
vector<int> weight(m + 1, 0);
vector<int> value(m + 1, 0);
for (int i = 0; i < m; i++)
{
cin >> weight[i];
}
for (int i = 0; i < m; i++)
{
cin >> value[i];
}
vector<int> dp(n + 1, 0);
for (int i = 0; i < m; i++){
for (int j = n; j >= weight[i]; j--){
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
}
}
cout << dp[n];
return 0;
}
96. 不同的二叉搜索树
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n + 1, 0);
if (n == 0) return 0;
if (n == 1) return 1;
dp[0] = 1;
for (int i = 1; i < dp.size(); i++){
for (int j = 1; j <= i; j++)
dp[i] += dp[j - 1] * dp[i - j];
}
return dp[n];
}
};
416. 分割等和子集
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = reduce(nums.begin(), nums.end());
if (sum % 2 == 1) return false;
int target = sum / 2;
vector<int> dp(target + 1, 0);
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;
}
else
{
return false;
}
}
};