acwing 9. 分组揹包问题

传送门

描述

有 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

分组揹包同样用01的思路来做,我们只需要控制同一组物品不一起使用就行了

AC代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[110][110],b[110][110],c[110],dp[110];
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int main()
{
	int n,M;
	n=read(),M=read();
	for(int i=1;i<=n;i++)
	{
		c[i]=read(); 
		for(int j=1;j<=c[i];j++){
			a[i][j]=read(),b[i][j]=read();
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=M;j>=0;j--)
		{
			for(int k=1;k<=c[i];k++)  //保证我们只取最优,且同组不冲突
			{
				if(j>=a[i][k])	dp[j]=max(dp[j],dp[j-a[i][k]]+b[i][k]);
			}
		}
	}
	cout<<dp[M]<<endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章