2019.4.27 提高B组 T2 nssl-1317 灵魂分流药剂

版权声明:虽然本蒟蒻很菜,但各位dalao转载请注明出处谢谢。 https://blog.csdn.net/xuxiayang/article/details/89600838

D e s c r i p t i o n Description

给定 n n 个东西,它们分为 m m 组,要求每组只能选1个,最终选出的值 v 1 v_1 v 2 v_2 不能超过 A A B B ,求最大价值

数据范围?
弱得要死。。。
N < = 100 ; M < = 10 ; A , B < = 100 N<=100;M<=10;A,B<=100


S o l u t i o n Solution

显然分组背包呀。。。


C o d e Code

#include<cstdio>
#include<cctype>
#include<vector>
#include<algorithm>
#define LL long long 
using namespace std;
int f[101][101],n,m,A,B,v1[101],v2[101],p[101],a[11][101],zb;
inline LL read()
{
    char c;int f=0,d=1;
    while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;
    while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;
    return d*f;
}
signed main()
{
	n=read();m=read();A=read();B=read();
	for(register int i=1;i<=n;i++) v1[i]=read(),v2[i]=read(),zb=read(),a[zb][++a[zb][0]]=i,p[i]=read();
	for(register int k=1;k<=m;k++)
	 for(register int V1=A;V1>=0;V1--)
	  for(register int V2=B;V2>=0;V2--)
	   for(register int i=1;i<=a[k][0];i++)
	{
		int tmp=a[k][i];
		if(V1>=v1[tmp]&&V2>=v2[tmp])
		f[V1][V2]=max(f[V1][V2],f[V1-v1[tmp]][V2-v2[tmp]]+p[tmp]);
	}
	printf("%d",f[A][B]);
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/89600838
今日推荐