1 条题解

  • 0
    @ 2023-2-16 13:48:44

    还是背包的板子 其实混合背包就是把01,完全,多重三种背包混合到一起的, 所以我们要找到一种方法将01与多重合并起来(完全背包可以分开算), 那么如果p【i】=0,也就是完全背包,直接用完全背包的模板算即可,如果是01,把它看成多重背包一起算就可以了 那么代码如下

    #include<bits/stdc++.h>
    using namespace std;
    int w[101],c[101],p[101];
    int f[5001],n,m;
    int main()
    {
    	scanf("%d%d",&m,&n);
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d%d%d",&w[i],&c[i],&p[i]); 
    	}
    	for(int i=1;i<=n;i++)
    	{
    		if(p[i]==0)
    		{
    			for(int v=w[i];v<=m;v++)
    			{
    				f[v]=max(f[v],f[v-w[i]]+c[i]);
    			}
    		}
    		else
    		for(int k=1;k<=p[i];k++)
    		{
    			for(int v=m;v>=w[i];v--) f[v]=max(f[v],f[v-w[i]]+c[i]);
    		}
    	}
    	cout<<f[m];
    	return 0;
    }
    
    • 1

    信息

    ID
    466
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    67
    已通过
    27
    上传者