分组背包问题学习笔记 AcWing 9. 分组背包问题

原题

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

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

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

输出最大价值。

输入格式

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

接下来有 N� 组数据:

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

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

数据范围

0 0 0

输入样例
3 5
2
1 2
2 4
1
3 4
1
4 5
输出样例:
8

原题链接

传送门 

代码

#include
using namespace std;

const int N=110;

int s[N];
int v[N][N],w[N][N];
int f[N];

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    
    for(int i=0;i=0;j--)
        {
            for(int k=0;k

总结

1.首先是数据范围比较小,只有100,可以使用N^3时间复杂度的算法通过这道题

2.给定的是n组物品,每一组物品里面有多件物品,一件物品只能选择一次,本质上还是01背包,选或者不选,两种情况,所以第二层循环还是从大往小枚举背包容量

3.每一组里面只能选择一件物品

4. 更多的理解之后有新的感想再补充

 

你可能感兴趣的:(acwing算法基础,学习,笔记,算法)