记录编号 461773 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 还是“金明的预算方案” 最终得分 100
用户昵称 GravatarShirry 是否通过 通过
代码语言 C++ 运行时间 0.786 s
提交时间 2017-10-20 17:48:49 内存使用 6.52 MiB
显示代码纯文本
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=3300;
const int maxm=65;
int n,m,s;
int f[maxn],w[maxm],v[maxm],g[maxm][maxn];
vector<int>p,q[maxm];
void work(int x,int y){//对第y件物品的附件进行01背包,其中x是它在vector里存的编号
	for(int i=0;i<(int)q[y].size();i++){
		int u=q[y][i];
		for(int j=n;j>=v[u];j--)
			g[x][j]=max(g[x][j],g[x][j-v[u]]+w[u]);
	}
	for(int j=n;j>=v[y];j--)g[x][j]=g[x][j-v[y]]+w[y];//不取max是因为一定要取主件
	for(int j=v[y]-1;j>=0;j--)g[x][j]=0;
}
int main(){
	freopen("budgetb.in","r",stdin);
	freopen("budgetb.out","w",stdout);
	scanf("%d%d%d",&n,&m,&s);
	n/=10;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&v[i],&w[i],&s);
		v[i]/=10,w[i]*=v[i];
		if(!s)p.push_back(i);
		else q[s].push_back(i);
	}
	for(int i=0;i<(int)p.size();i++)work(i+1,p[i]);
	for(int i=1;i<=(int)p.size();i++){
		for(int j=n;j>=0;j--)
			for(int k=0;k<=j;k++)
				f[j]=max(f[j],f[k]+g[i][j-k]);
	}
	printf("%d\n",f[n]*10);
	return 0;
}