动态规划:分组背包问题

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

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;
}
目录
相关文章
|
5月前
|
存储 算法
动态规划(背包问题)
动态规划(背包问题)
|
6月前
|
算法
动态规划—(背包问题)
动态规划—(背包问题)
|
6月前
|
消息中间件 Kubernetes NoSQL
动态规划- 背包问题总结(二)
动态规划- 背包问题总结(二)
|
6月前
|
消息中间件 Kubernetes NoSQL
动态规划- 背包问题总结(一)
动态规划- 背包问题总结(一)
|
算法 C语言 C++
【动态规划】多重背包问题,分组背包问题
与完全背包问题不同的是,每种东西都是有限件,前两种状态就不再过多赘述
147 4
|
存储 算法
动态规划之背包问题
动态规划之背包问题
96 0
动态规划——多重背包、分组背包
动态规划——多重背包、分组背包
62 0
动态规划:多重背包问题
动态规划:多重背包问题
70 0
动态规划:完全背包问题
动态规划:完全背包问题
75 0