• 背包问题极小值空间至少是j


    背包问题-最小价值-空间至少是\(j\)

    一、\(01\)背包

    例子:给你一堆物品,每个物品有一定的体积和对应的价值,每个物品可以选\(1\)求总体积至少是\(j\)最小价值

    办法:
    初始化是\(f[0][0] = 0\), 其余是\(INF\)(只会求价值的最小值

    输入

    3  5
    1  2
    4  9
    3  6
    

    输出

    11
    

    一、二维

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int N = 110;
    const int INF = 0x3f3f3f3f;
    /*
    个数  空间至少5 
    体积  价值
    
    求:   最小价值
    
    3     5
    1     2
    4     9
    3     6
    
    答案应该是:11。 即 1,4-->2+9=11
    */
    int n, m;
    int f[N][N];
    
    int main() {
        scanf("%d %d", &n, &m);
    
        memset(f, 0x3f, sizeof f);
        f[0][0] = 0;
    
        // 01背包!!!
        for (int i = 1; i <= n; i++) {
            int v, w;
            scanf("%d %d", &v, &w);
            for (int j = 0; j <= m; j++)
                f[i][j] = min(f[i - 1][j], f[i - 1][max(0, j - v)] + w);
        }
        printf("%d\n", f[n][m]);
        return 0;
    }
    
    

    二、一维

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int N = 110;
    const int INF = 0x3f3f3f3f;
    /*
    个数  空间至少5 
    体积  价值
    
    求:   最小价值
    
    3     5
    1     2
    4     9
    3     6
    
    答案应该是:11。 即 1,4-->2+9=11
    */
    int n, m;
    int f[N];
    
    int main() {
        scanf("%d %d", &n, &m);
    
        memset(f, 0x3f, sizeof f);
        f[0] = 0;
    
        // 01背包!!!
        for (int i = 1; i <= n; i++) {
            int v, w;
            scanf("%d %d", &v, &w);
            for (int j = m; j >= v; j--)
                f[j] = min(f[j], f[max(0, j - v)] + w);
        }
        printf("%d\n", f[m]);
        return 0;
    }
    
    

    二、完全背包

    例子:给你一堆物品,每个物品有一定的体积和对应的价值,每个物品可以选无限个求总体积至少是\(j\)最小价值

    一、二维

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int N = 110;
    const int INF = 0x3f3f3f3f;
    /*
    个数  空间至少5 
    体积  价值
    
    求:   最小价值
    
    1     5
    1     1
    
    
    ---
    
    再来一组数据
    
    个数  空间至少5 
    体积  价值
    
    求:   最小价值
    
    3     5
    1     2
    4     9
    3     6
    
    */
    int n, m;
    int f[N][N];
    
    int main() {
        scanf("%d %d", &n, &m);
    
        memset(f, 0x3f, sizeof f);
        f[0][0] = 0;
    
        //这么写是可以选择多个的,也就是完全背包!!!
        for (int i = 1; i <= n; i++) {
            int v, w;
            scanf("%d %d", &v, &w);
            for (int j = 0; j <= m; j++)
                f[i][j] = min(f[i - 1][j], f[i][max(0, j - v)] + w); //即使物品体积比j大,j - v < 0,也能选,等价于f[i - 1][0]
        }
        printf("%d\n", f[n][m]);
        return 0;
    }
    
    

    二、一维

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int N = 110;
    const int INF = 0x3f3f3f3f;
    /*
    个数  空间至少5 
    体积  价值
    
    求:   最小价值
    
    1     5
    1     1
    
    
    ---
    
    再来一组数据
    
    个数  空间至少5 
    体积  价值
    
    求:   最小价值
    
    3     5
    1     2
    4     9
    3     6
    
    答案:10
    */
    int n, m;
    int f[N];
    
    int main() {
        scanf("%d %d", &n, &m);
    
        memset(f, 0x3f, sizeof f);
        f[0] = 0;
    
        //这么写是可以选择多个的,也就是完全背包!!!
        for (int i = 1; i <= n; i++) {
            int v, w;
            scanf("%d %d", &v, &w);
            for (int j = 0; j <= m; j++)
                f[j] = min(f[j], f[max(0, j - v)] + w);
        }
        printf("%d\n", f[m]);
        return 0;
    }
    
  • 相关阅读:
    白盒测试的特点
    什么是黑盒测试
    黑盒测试优缺点
    单元测试
    孤立的测试策略
    自顶向下的单元测试策略
    自底向上的单元测试策略
    tabbedApliction
    redis的key对应mysql数据表设计
    达内javase_day1笔记
  • 原文地址:https://www.cnblogs.com/littlehb/p/15848743.html
Copyright © 2020-2023  润新知