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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章