记录编号 233041 评测结果 AAAAAAAAAA
题目名称 [NOIP 2006]金明的预算方案 最终得分 100
用户昵称 Gravatar烟雨 是否通过 通过
代码语言 C++ 运行时间 0.105 s
提交时间 2016-03-03 20:53:38 内存使用 7.76 MiB
显示代码纯文本
#include<fstream>
#include<algorithm>
using namespace std;
int m,n,v[61],p[61],q[61],price[61],f[61][32001],w=0;
int main()
{
	ifstream cin("budget.in"); 
	ofstream cout("budget.out"); 
	cin>>n>>m; 
	for(int i=1;i<=m;i++) 
	{ 
		cin>>v[i]>>p[i]>>q[i]; 
		price[i]=v[i]*p[i]; 
	} 
	for(int i=0;i<=m;i++) 
	{ 
		for(int j=0;j<=n;j++) 
		{
			if(i==0||j==0) f[i][j]=0;
			else if(i>0&&q[i]!=0)f[i][j]=f[i-1][j]; 
		    else if(i>0&&j<v[i])f[i][j]=f[i-1][j]; 
		    else if((i>0&&j>=v[i])&&q[i]==0) 
			{ 
				int f1[3]={0},u=1; 
				for(int a=1;a<=m;a++)
				{ 
					if(q[a]==i) 
					{ 
						f1[u]=a;
						u++; 
					} 
				}
				if(u==1)f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+price[i]); 
				if(u==2)
				{
					if(j>=v[i]+v[f1[1]])f[i][j]=max(max(f[i-1][j],f[i-1][j-v[i]]+price[i]),f[i-1][j-v[i]-v[f1[1]]]+price[i]+price[f1[1]]);
					if(j<v[i]+v[f1[1]]) f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+price[i]); 
				} 
				if(u==3) 
				{ 
					if(j>=v[i]+v[f1[1]]+v[f1[2]]) f[i][j]=max(f[i-1][j],max(f[i-1][j-v[i]]+price[i],max(f[i-1][j-v[i]-v[f1[1]]]+price[i]+price[f1[1]],f[i-1][j-v[i]-v[f1[1]]-v[f1[2]]]+price[i]+price[f1[1]]+price[f1[2]]))); 
					else if(j>=v[i]+v[f1[1]]) f[i][j]=max(f[i-1][j],max(f[i-1][j-v[i]]+price[i],f[i-1][j-v[i]-v[f1[1]]]+price[i]+price[f1[1]]));
					else if(j>=v[i]+v[f1[2]]) f[i][j]=max(f[i-1][j],max(f[i-1][j-v[i]]+price[i],f[i-1][j-v[i]-v[f1[2]]]+price[i]+price[f1[2]])); 
					else if(j>=v[i]) f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+price[i]);
				}
			}
		} 
	} 
	cout<<f[m][n]<<endl; 
	cin.close(); 
	cout.close(); 
	return 0; 
}