zoj 1013 Great Equipment

真的好变态的DP啊,死想想不出来,记住了这道变态dp

#include<stdio.h>
#include<cstring>
#include<algorithm> 
using namespace std;
#define M 105
#define MAX 505
int n,w[3],s[3],d[3],c[3],d4,x[M],y[M],dp[2][MAX][MAX],a,b;
void func(){
    int p,q,i,j,t,maxx=0,maxy=0,tmp,tmpx,tmpy,tmpz;
    for(t=1;t<=n;t++){
memset(dp[t%2],-1,sizeof(dp[t%2]));
a=x[t]/w[0];  b=y[t]/s[0];   tmpx=a<b?a:b;
for(i=0;i<=tmpx;i++){
a=(x[t]-w[0]*i)/w[1]; b=(y[t]-s[0]*i)/s[1];
tmpy=a<b?a:b; 
if(i==0)tmp=tmpy;
for(j=0;j<=tmpy;j++){
a=(x[t]-w[0]*i-w[1]*j)/w[2];
b=(y[t]-s[0]*i-s[1]*j)/s[2]; tmpz=a<b?a:b;
for(p=0;p<=maxx;p++)
for(q=0;q<=maxy;q++)
if(dp[(t+1)%2][p][q]!=-1){
a=dp[t%2][p+i][q+j];
b=dp[(t+1)%2][p][q]+tmpz;
dp[t%2][p+i][q+j]=a>b?a:b;
}
        }
}
maxx+=tmpx;
maxy+=tmp;
}
int rst=0,def=max(0,d4-c[0]*d[0]-c[1]*d[1]-c[2]*d[2]);
for(i=0;i<=maxx;i++)
for(j=0;j<=maxy;j++)
if(dp[(t+1)%2][i][j]!=-1){
tmp=min(i/c[0],j/c[1]);
tmp=min(tmp,dp[(t+1)%2][i][j]/c[2]);
a=i*d[0]+j*d[1]+dp[(t+1)%2][i][j]*d[2]+def*tmp;
rst=a>rst?a:rst;
}
printf("%d\n",rst);
}
int main(){
    int i,cas=0;
    while(scanf("%d",&n),n){
        for(i=0;i<3;i++)
            scanf("%d %d %d",&w[i],&s[i],&d[i]);
        for(i=0;i<3;i++)
            scanf("%d",&c[i]);
        scanf("%d",&d4);
        for(i=1;i<=n;i++)
            scanf("%d %d",&x[i],&y[i]);
        memset(dp[0],0,sizeof(dp[0]));
        if(cas>0)printf("\n");
        printf("Case %d: ",++cas);
func();
    }
    return 0;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值