分组背包
分组背包是说,所有的物品分成了很多组,每组中的物品都是互斥的,也就是说每组最多只能取一个。其实还是按照01的思想来做,将每组看成01的物品,然后每组中到底选哪个再遍历细分。
int dp[MAXN],v[MAXN],w[MAXN];
int n,m;//组数,背包容积
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
int sum;//y第i组的数量
cin>>sum;
for(int j=0;j<sum;j++)
cin>>v[j]>>w[j];
for(int j=m;j>=0;j--)
{
for(int k=0;k<sum;k++)
if(v[k]<=j) dp[j]=max(dp[j],dp[j-v[k]]+w[k]);
}
}
cout<<dp[m];
}
也就是01的做法,欢迎留言