记录编号 |
549839 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2006]金明的预算方案 |
最终得分 |
100 |
用户昵称 |
夜莺 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.069 s |
提交时间 |
2020-02-25 11:25:51 |
内存使用 |
4.54 MiB |
显示代码纯文本
#include<cstdio>
using namespace std;
const int MAXN=36010,MAXM=70;
int v[MAXM],p[MAXM];
int vv[MAXM][4],pp[MAXM][4];
int f[MAXN];
int tong[MAXM];
int ber[MAXM];
int n,m,num;
int main(){
freopen("budget.in","r",stdin);
freopen("budget.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1,q;i<=m;i++){
scanf("%d%d%d",&p[i],&v[i],&q);
v[i]*=p[i];
if(!q){
num++;
tong[i]=num;
for(int k=0;k<4;k++){
vv[num][k]=v[i];
pp[num][k]=p[i];
}
}
else{
vv[tong[q]][3]+=v[i];
pp[tong[q]][3]+=p[i];
ber[tong[q]]++;
if(vv[tong[q]][1]==vv[tong[q]][0]&&pp[tong[q]][1]==pp[tong[q]][0]){
vv[tong[q]][1]+=v[i];
pp[tong[q]][1]+=p[i];
}
else{
vv[tong[q]][2]+=v[i];
pp[tong[q]][2]+=p[i];
ber[tong[q]]++;
}
}
}
//printf("num:\n");
//for(int i=1;i<=num;i++)
// printf("%d ",ber[i]);
//printf("\nprice:\n");
//for(int i=1;i<=num;i++)
// printf("%d %d %d %d\n",vv[i][0],vv[i][1],vv[i][2],vv[i][3]);
//printf("heavy:\n");
//for(int i=1;i<=num;i++)
// printf("%d %d %d %d\n",pp[i][0],pp[i][1],pp[i][2],pp[i][3]);
for(int i=1;i<=num;i++)
for(int j=n;j>=0;j--)
for(int k=0;k<=ber[i];k++)
if(pp[i][k]<=j&&f[j-pp[i][k]]+vv[i][k]>f[j])
f[j]=f[j-pp[i][k]]+vv[i][k];
//printf("ans:\n");
printf("%d",f[n]);
return 0;
}