NOIP2006金明的预算方案

来源:互联网 发布:如何免费创建企业域名 编辑:程序博客网 时间:2024/05/21 09:16

有依赖的DP,标准写法是树形的但是听说这题会t……

#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<cstdlib>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define down(i,a,b) for(int i=a;i>=b;i--)using namespace std;#define M 40000#define N 100int f[M];int w[N],c[N],lin[N],dfn[N][N];int n,m,ans=0;void ini(){scanf("%d%d",&m,&n);fo(i,1,n){int x,y,z;scanf("%d%d%d",&x,&y,&z);w[i]=x;c[i]=x*y;lin[i]=z;if(z)dfn[z][++dfn[z][0]]=i;}}void DP(){fo(i,1,n)if(lin[i]==0)down(j,m,w[i]){f[j]=max(f[j],f[j-w[i]]+c[i]);int t=j-w[i];if(dfn[i][0]&&t-w[dfn[i][1]]>=0){f[j]=max(f[j],f[t-w[dfn[i][1]]]+c[i]+c[dfn[i][1]]);}if(dfn[i][0]>1){if(t-w[dfn[i][2]]>=0){f[j]=max(f[j],f[t-w[dfn[i][2]]]+c[i]+c[dfn[i][2]]);}t-=w[dfn[i][1]]+w[dfn[i][2]];if(t>=0){f[j]=max(f[j],f[t]+c[i]+c[dfn[i][1]]+c[dfn[i][2]]);}}ans=max(ans,f[j]);}}void OUT(){cout<<ans<<endl;}int main(){ini();DP();OUT();//system("pause");return 0;}


0 0
原创粉丝点击