zoukankan      html  css  js  c++  java
  • DP

    分组背包问题

    有 N 组物品和一个容量是 V 的背包。

    每组物品有若干个,同一组内的物品最多只能选一个。
    每件物品的体积是 vij,价值是 wij,其中 i 是组号,j 是组内编号。

    求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。

    输出最大价值。

    输入格式
    第一行有两个整数 N,V,用空格隔开,分别表示物品组数和背包容量。

    接下来有 N 组数据:

    每组数据第一行有一个整数 Si,表示第 i 个物品组的物品数量;
    每组数据接下来有 Si 行,每行有两个整数 vij,wij,用空格隔开,分别表示第 i 个物品组的第 j 个物品的体积和价值;
    输出格式
    输出一个整数,表示最大价值。

    数据范围
    0<N,V≤100
    0<Si≤100
    0<vij,wij≤100
    输入样例
    3 5
    2
    1 2
    2 4
    1
    3 4
    1
    4 5
    输出样例:
    8

    问题大意:

    给出 n 组物品和一个体积为 m 的背包,接下来输入n组数据,每组数据输入一个s表示该组物品数,每组物品中最多只能选1个带走,求背包内可容纳的最大价值。

    问题分析:

    这道题有多组物品,但每组只能选一个,数据范围为100,故可以枚举组内每一个物品来表示状态。 先枚举体积 m -> 0 再枚举组内每一个物品,大循环是 1 - n 表示共 n 组物品,代码实现:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <cstring>
    using namespace std;
    const int N = 110;
    int v[N],w[N],f[N];
    int main()
    {
        memset(f, 0, sizeof f);
        int n, m;
        cin >> n >> m;
        for (int i = 0; i < n; i ++ )
        {
            int s;
            cin >> s;
            for(int j = 0; j < s; j ++ )
              cin >> v[j] >> w[j];
            for (int j = m; j >= 0; j --)
              for (int k = 0; k < s; k ++)
                if(j - v[k] >= 0)//因为组内体积是不定的,所以要加一个判断条件
                  f[j] = max(f[j], f[j - v[k]] + w[k]);//每一组只能带走一件
        }
        cout << f[m] << endl;
        return 0;
    }
    
  • 相关阅读:
    从程序员到主编顺利转型
    DAS、NAS、SAN区别
    网线知识全接触
    浅议DAS、NAS、SAN区别
    写辞职信要注意的五个要点
    劳动合同签订中的法律问题
    辞职了,离职手续怎么办?
    系统集成工程师知识储备
    还是关于 标记当前
    一个JSON 实例 jQuery 解析JSON数据
  • 原文地址:https://www.cnblogs.com/Hayasaka/p/14294208.html
Copyright © 2011-2022 走看看