傳送門
描述
有 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;
}