记录编号 |
233041 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2006]金明的预算方案 |
最终得分 |
100 |
用户昵称 |
烟雨 |
是否通过 |
通过 |
代码语言 |
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;
}