一、不同的二叉搜索树
1、题目:
给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
2、代码:
#include<vector>
#include<iostream>
using namespace std;
int main() {
int n;
cin >> n;
vector<int>dp(n + 1);
dp[0] = 1;
for (int i = 1; i < n; i++) {
for (int j = 1; j < n; j++) {
dp[i] += dp[j - 1] + dp[i - j];
}
}
cout << dp[n];
}
二、0-1背包
(一)、二维数组
1、题目:
背包最大重量为4,物品0、1、2所对应的重量为1、3、4所对应的价值为15、20、30,问背包所能背的物品的最大价值为?
2、代码:
#include<bits/stdc++.h>
using namespace std;
int n, bagweight;
int weight(n);
int value(n);
int main() {
cin >> n >> bagweight;
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 = value[0]; j < bagweight; j++) {
dp[0][j] = value[0];
}
for (int i = 1; i < n; i++) {
for (int j = 1; 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][j-weight[i]]+value[i])
}
}
cout << dp[weight.size() - 1][bagweight];
return 0;
}
}
(二)、一维数组/滚动数组
1、题目:
背包最大重量为4,物品0、1、2所对应的重量为1、3、4所对应的价值为15、20、30,问背包所能背的物品的最大价值为?
2、代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, bagweight;
cin >> n >> bagweight;
vector<int>weight(n);
vectoir<int>value(n);
for (int i = 0; i < n; i++) {
cin >> weight[i];
}
for (int j = 0; j < n; j++) {
cin >> value[j];
}
vector<int>dp(bagweight+ 1, 0);
for (int i = 0; i < weight.size(); i++) {
for (int j = bagweight; j >= weight[i]; j--) {
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
}
}
cout << dp[n];
}
(三)、分割等和子集
1、题目:
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200
2、代码:
#include<bits/stdc++.h>
using namespace std;
bool Subanggregate(vector<int>& nums) {
for (int i=0; i < nums.size(); i++) {
cin >> nums[i];
}
vector<int>dp(10001, 0);
int sum = 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 ture;
}
}