• 背包九讲之六:分组背包问题:每组只能选一个物品


    有 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
     
     1 #include<iostream>
     2 #include<algorithm>
     3 using namespace std;
     4 /*
     5 每组物品有s+1种选择,要么不选本组物品,
     6 要么选第1个物品,……要么选第s个物品。
     7 f[j]=max{f[j],f[j-v[0]]+w[0],f[j-v[1]]+w[1],……,f[j-v[s-1]]+w[s-1]}
     8 */
     9 const int array_size = 101;
    10 int f[array_size], N, V, s, v[array_size], w[array_size];
    11 int main() {
    12     cin >> N >> V;
    13     for (int i = 0; i < N; ++i) {
    14         cin >> s;
    15         for (int j = 0; j < s; ++j)
    16             cin >> v[j] >> w[j];
    17         for (int j = V; j >= 0; --j)
    18             for (int k = 0; k < s; ++k)
    19                 if (j >= v[k])
    20                     f[j] = max(f[j], f[j - v[k]] + w[k]);
    21     }
    22     cout << f[V];
    23 }
  • 相关阅读:
    Sudoku Solver [LeetCode]
    Populating Next Right Pointers in Each Node [LeetCode]
    Binary Tree Level Order Traversal [LeetCode]
    Clone Graph [LeetCode]
    Merge k Sorted Lists [LeetCode]
    Combinations [LeetCode]
    021 面向对象 一
    给图片加点料
    质数
    ex10 找出藏在字符串中的“密码”
  • 原文地址:https://www.cnblogs.com/xiehuazhen/p/12465642.html
Copyright © 2020-2023  润新知