HDU 4501 小明系列故事――买年货 (二)

2014-11-24 03:23:31 · 作者: · 浏览: 1
105],b[105],val[105],dp[105][105][10];
while(scanf("%d%d%d%d",&n,&v1,&v2,&k)!=-1)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(val,0,sizeof(val));
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
scanf("%d%d%d",&a[i],&b[i],&val[i]);
for(i=1;i<=n;i++)
for(p=v1;p>=0;p--)
for(q=v2;q>=0;q--)
for(r=k;r>=0;r--)
//p,q,r分别代表现金,积分,免费k件,注意讨论所有状态(三种代价均够买某件物品,只有两种,只有一种,或者没有代价可购买某件物品)
{
if(r>0&&p>=a[i]&&q>=b[i])
dp[p][q][r]=max1(dp[p][q][r],dp[p-a[i]][q][r]+val[i],dp[p][q-b[i]][r]+val[i],dp[p][q][r-1]+val[i]);
else if(p>=a[i]&&q>=b[i])
dp[p][q][r]=max2(dp[p][q][r],dp[p-a[i]][q][r]+val[i],dp[p][q-b[i]][r]+val[i]);
else if(p>=a[i]&&r>0)
dp[p][q][r]=max2(dp[p][q][r],dp[p-a[i]][q][r]+val[i],dp[p][q][r-1]+val[i]);
else if(q>=b[i]&&r>0)
dp[p][q][r]=max2(dp[p][q][r],dp[p][q-b[i]][r]+val[i],dp[p][q][r-1]+val[i]);
else if(p>=a[i])
dp[p][q][r]=max(dp[p][q][r],dp[p-a[i]][q][r]+val[i]);
else if(q>=b[i])
dp[p][q][r]=max(dp[p][q][r],dp[p][q-b[i]][r]+val[i]);
else if(r>0)
dp[p][q][r]=max(dp[p][q][r],dp[p][q][r-1]+val[i]);
}
printf("%d\n",dp[v1][v2][k]);
}
return 0;
}