dp3

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;
        }
    }
};
posted @ 2025-02-16 19:39  skyler886  阅读(6)  评论(0)    收藏  举报