动态规划:分组背包问题

简介: 动态规划:分组背包问题

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

每组物品有若干个,同一组内的物品最多只能选一个。

每件物品的体积是 vi j,价值是 wi j,其中 i是组号,j 是组内编号。

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

输出最大价值。

输入格式

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


接下来有 N组数据:


每组数据第一行有一个整数 Si,表示第 i 个物品组的物品数量;


每组数据接下来有 Si 行,每行有两个整数 vi j, wi j,用空格隔开,分别表示第 i 个物品组的第 j 个物品的体积和价值;

输出格式

输出一个整数,表示最大价值。

数据范围

0<N,V≤100

0<Si≤100

0<vi j,wi j≤100

输入样例

3 5
2
1 2
2 4
1
3 4
1
4 5


输出样例:

8

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100;
int n, m;
int v[N][N], w[N][N], s[N];//重量  价值 每组物品格个数
int dp[N];
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        cin >> s[i];
        for (int j = 0; j < s[i]; j++)
        {
            cin >> v[i][j] >> w[i][j];
        }
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = m; j >= 0; j--)
        {
            for (int k = 0; k < s[i]; k++)
            {
                if (v[i][k] <= j)
                {
                    dp[j] = max(dp[j], dp[j - v[i][k]] + w[i][k]);
                }
            }
        }
    }
    cout << dp[m] << endl;
    return 0;
}
目录
相关文章
|
6月前
|
算法 程序员
程序员必知:动态规划——背包问题1:01背包
程序员必知:动态规划——背包问题1:01背包
39 0
|
6月前
|
C++
每日练习之——背包问题
每日练习之——背包问题
33 1
|
7月前
|
算法 测试技术 C#
|
算法 C语言 C++
【动态规划】多重背包问题,分组背包问题
与完全背包问题不同的是,每种东西都是有限件,前两种状态就不再过多赘述
151 4
|
算法 C语言 C++
【动态规划】背包问题(01背包,完全背包)
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
128 0
动态规划——多重背包、分组背包
动态规划——多重背包、分组背包
65 0
动态规划:多重背包问题
动态规划:多重背包问题
77 0
动态规划:完全背包问题
动态规划:完全背包问题
78 0
动态规划-完全背包
前言 我们上篇文章学习了动态规划01背包的问题,本篇文章我们继续学习完全背包。大家可以在学习完01背包的基础上再进行学习,比较其两者的解题差异。
|
测试技术 容器
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(三)
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(三)
228 0
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(三)