社区讨论

90分蒟蒻求助

P1064[NOIP 2006 提高组] 金明的预算方案参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@lobjyytp
此快照首次捕获于
2023/10/29 22:14
2 年前
此快照最后确认于
2023/11/04 03:15
2 年前
查看原帖
麻了,实在不知道错在哪里了QAQ
CPP
#include<bits/stdc++.h>
using namespace std;
int f[61][32005],v[61][10],w[61][10],head[61],head2[61];//v:价格  w:重要度 head:记录元素数 head2:记录第i个物品在第几组
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(register int i=1;i<=m;i++)
	{
		int vv,bb,ww;
		scanf("%d%d%d",&vv,&ww,&bb);
		if(bb==0)
		{
			head[0]++;
			head2[i]=head[0];
			v[head[0]][0]=vv;
			w[head[0]][0]=ww;
		}
		else
		{
			head[bb]++;
			head2[i]=head2[bb];
			v[head2[bb]][head[bb]]=vv;
			w[head2[bb]][head[bb]]=ww;
		}
	}//head[0]是用来分组的,其余是用来标每组元素个数的
	for(register int i=1;i<=head[0];i++)
	{
		int v0=v[i][0],v1=v[i][1],v2=v[i][2],w0=w[i][0],w1=w[i][1],w2=w[i][2];//最多共有5种情况:不取,取主,取主副1,取主副2,全取
		for(register int j=n;j>=v0;j--)
		{
			if(f[i-1][j-v0]+v0*w0>f[i][j]&&j-v0>=0)
			    f[i][j]=max(f[i-1][j-v0]+v0*w0,f[i-1][j]);
			if(f[i-1][j-v0-v1]+v0*w0+v1*w1>f[i][j]&&j-v0-v1>=0)
			    f[i][j]=max(f[i-1][j-v0-v1]+v0*w0+v1*w1,f[i-1][j]);
			if(f[i-1][j-v0-v2]+v0*w0+v2*w2>f[i][j]&&j-v0-v2>=0)
			    f[i][j]=max(f[i-1][j-v0-v2]+v0*w0+v2*w2,f[i-1][j]);
			if(f[i-1][j-v0-v1-v2]+v0*w0+v1*w1+v2*w2>f[i][j]&&j-v0-v1-v2>=0)
			    f[i][j]=max(f[i-1][j-v0-v1-v2]+v0*w0+v1*w1+v2*w2,f[i-1][j]);			
		}
	}
	printf("%d",f[head[0]][n]);
	return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...