P1757 通天之分组背包(洛谷)

原题传送门

在这里插入图片描述

思路:分组背包问题,比01背包和完全背包复杂一点,但是套路都差不多,只是分组背包问题的遍历得从枚举每一组开始,再枚举剩余容量,接着枚举各组里物品的序号,然后满足条件就套用状态转移方程,最后输出即可.

代码参考

#include <bits/stdc++.h>
using namespace std;
int f[1001],w[1001],v[1001],c[101][101],cc[101],z,m,n;
/*
** w:某种物品的重量,v:某种物品的价值,c[][]:第几组第几件物品的序号
** cc[]:第几组的物品件数,z:组数,m:总重量,n:全部物品件数
*/
int main()
{
    
    
    cin>>m>>n;
    for(int i=1;i<=n;i++)
    {
    
    
    	int C;
    	cin>>w[i]>>v[i]>>C;
    	z=max(z,C);
    	cc[C]++;
    	c[C][cc[C]]=i;
	}
    for(int i=1;i<=z;i++)
    	for(int j=m;j>=0;j--)
    		for(int k=1;k<=cc[i];k++)
    		if(j>=w[c[i][k]])
    		f[j]=max(f[j],f[j-w[c[i][k]]]+v[c[i][k]]);
    cout<<f[m];
}

猜你喜欢

转载自blog.csdn.net/Bertil/article/details/106764548