背包问题

01背包问题

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    
    const int N = 1010;
    
    int n, m;
    int v[N], w[N];
    int f[N];
    int g[N];
    
    int main()
    {
        scanf("%d %d", &n, &m);
        for (int i = 1; i <= n; i++)
        {
            scanf("%d %d", &v[i], &w[i]);
        }
    
        // for (int i = n; i >= 1; i--)
        // {
        //     for (int j = 0; j <= m; j++)
        //     {
        //         if (j < v[i])
        //         {
        //             g[j] = f[j];
        //         }
        //         else if (j >= v[i])
        //         {
        //             g[j] = max(f[j], f[j - v[i]] + w[i]);
        //         }
        //     }
        //     memcpy(f, g, sizeof g);
        // }
        // cout<<f[m]<<endl;
    
        // for (int i = 1; i <= n; i++)
        // {
        //     for (int j = 0; j <= m; j++)
        //     {
        //         if (j < v[i])
        //         {
        //             g[j] = f[j];
        //         }
        //         else if (j >= v[i])
        //         {
        //             g[j] = max(f[j], f[j - v[i]] + w[i]);
        //         }
        //     }
        //     memcpy(f, g, sizeof g);
        // }
        // cout << f[m] << endl;
    
    
        // for (int i = 1; i <= n; i++)
        // {
        //     for (int j = m; j >= 0; j--)
        //     {
        //         if (j >= v[i])
        //         {
        //             f[j] = max(f[j], f[j - v[i]] + w[i]);
        //         }
        //     }
        // }
        // cout << f[m] << endl;
    
        for (int i = n; i >= 1; i--)
        {
            for (int j = m; j >= 0; j--)
            {
                if (j >= v[i])
                {
                    f[j] = max(f[j], f[j - v[i]] + w[i]);
                }
            }
        }
        cout << f[m] << endl;
    
        return 0;
    }

    完全背包问题

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 1010;
    
    int n, m;
    int v[N], w[N];
    int mem[N][N];
    int f[N][N];
    int g[N];
    
    int dfs(int x, int spV)
    {
        if (mem[x][spV])
            return mem[x][spV];
    
        int sum = 0;
        if (x > n)
            sum = 0;
        else if (spV < v[x])
            sum = dfs(x + 1, spV);
        else
            sum = max(dfs(x + 1, spV), dfs(x, spV - v[x]) + w[x]);
    
        mem[x][spV] = sum;
        return sum;
    }
    
    int main()
    {
        cin >> n >> m;
        for (int i = 1; i <= n; i++)
            cin >> v[i] >> w[i];
    
        // int res=dfs(1,m);
        // cout << res << endl;
    
        // for (int i = 1; i <= n; i++)
        //     for (int j = v[i]; j <= m; j++)
        //     {
        //         if (j < v[i])
        //             f[i][j] = f[i - 1][j];
        //         else
        //             f[i][j] = max(f[i - 1][j], f[i][j - v[i]] + w[i]);
        //     }
        // cout << f[n][m] << endl;
    
        for (int i = 1; i <= n; i++)
            for (int j = v[i]; j <= m; j++) // j不能从0开始,因为j-v[i]可能小于0,导致g[j-v[i]]越界
            {
                g[j] = max(g[j], g[j - v[i]] + w[i]);
            }
        cout << g[m] << endl;
    
        return 0;
    }

    01背包求体积恰好为M的方案数:数字组合

    完全背包求体积恰好为M的方案数:买书

    二维费用的背包问题

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 1010;
    
    int n, V, M;
    int v[N], m[N], w[N];
    int mem[N][110][110];
    int f[N][110][110];
    int g[110][110];
    
    int dfs(int x, int spV, int spM)
    {
        if (mem[x][spV][spM])
            return mem[x][spV][spM];
    
        int sum = 0;
        if (x > n)
            sum = 0;
        else if (spV < v[x] || spM < m[x])
            sum = dfs(x + 1, spV, spM);
        else
            sum = max(dfs(x + 1, spV, spM), dfs(x + 1, spV - v[x], spM - m[x]) + w[x]);
        mem[x][spV][spM] = sum;
        return sum;
    }
    
    int main()
    {
        cin >> n >> V >> M;
        for (int i = 1; i <= n; i++)
            cin >> v[i] >> m[i] >> w[i];
    
        // int res=dfs(1,V,M);
        // cout<<res<<endl;
    
        // for (int i = n; i >= 1; i--)
        //     for (int j = 0; j <= V; j++)
        //         for (int k = 0; k <= M; k++)
        //         {
        //             if (j < v[i] || k < m[i])
        //                 f[i][j][k] = f[i + 1][j][k];
        //             else
        //                 f[i][j][k] = max(f[i + 1][j][k], f[i + 1][j - v[i]][k - m[i]] + w[i]);
        //         }
        // cout << f[1][V][M] << endl;
    
        // for (int i = 1; i <= n; i++)
        //     for (int j = V; j >= v[i]; j--)
        //         for (int k = M; k >= m[i]; k--)
        //         {
        //             g[j][k] = max(g[j][k], g[j - v[i]][k - m[i]] + w[i]);
        //         }
        // cout << g[V][M] << endl;
    
        for (int i = n; i >= 1; i--)
            for (int j = V; j >= v[i]; j--)
                for (int k = M; k >= m[i]; k--)
                {
                    g[j][k] = max(g[j][k], g[j - v[i]][k - m[i]] + w[i]);
                }
        cout << g[V][M] << endl;
    
        return 0;
    }

    背包问题求具体方案

    暂无评论

    发送评论 编辑评论

    
    				
    |´・ω・)ノ
    ヾ(≧∇≦*)ゝ
    (☆ω☆)
    (╯‵□′)╯︵┴─┴
     ̄﹃ ̄
    (/ω\)
    ∠( ᐛ 」∠)_
    (๑•̀ㅁ•́ฅ)
    →_→
    ୧(๑•̀⌄•́๑)૭
    ٩(ˊᗜˋ*)و
    (ノ°ο°)ノ
    (´இ皿இ`)
    ⌇●﹏●⌇
    (ฅ´ω`ฅ)
    (╯°A°)╯︵○○○
    φ( ̄∇ ̄o)
    ヾ(´・ ・`。)ノ"
    ( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
    (ó﹏ò。)
    Σ(っ °Д °;)っ
    ( ,,´・ω・)ノ"(´っω・`。)
    ╮(╯▽╰)╭
    o(*////▽////*)q
    >﹏<
    ( ๑´•ω•) "(ㆆᴗㆆ)
    😂
    😀
    😅
    😊
    🙂
    🙃
    😌
    😍
    😘
    😜
    😝
    😏
    😒
    🙄
    😳
    😡
    😔
    😫
    😱
    😭
    💩
    👻
    🙌
    🖕
    👍
    👫
    👬
    👭
    🌚
    🌝
    🙈
    💊
    😶
    🙏
    🍦
    🍉
    😣
    Source: github.com/k4yt3x/flowerhd
    颜文字
    Emoji
    小恐龙
    花!
    上一篇
    下一篇