BZOJ 1021 DP

来源:互联网 发布:如何评价雅尼 知乎 编辑:程序博客网 时间:2024/05/22 17:27

dp[i][j][k]表示到了第i种面值,第一个人还有j元钱,第二个人还有k元钱的最少交换张数。
枚举钱的种类和两个人的钱的数目,转移即可。

#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<cmath>#include<algorithm>using namespace std;typedef long long LL;int dp[2][1010][1010],cnt[4][10],mcnt[10];int money[]={0,1,5,10,20,50,100};int x1,x2,x3,sum;int has[4];int main(){    scanf("%d%d%d",&x1,&x2,&x3);    memset(has,0,sizeof(has));    memset(mcnt,0,sizeof(mcnt));    for(int i=1;i<=3;i++){        for(int j=6;j>=1;j--){            scanf("%d",&cnt[i][j]);            mcnt[j]+=cnt[i][j];            has[i]+=cnt[i][j]*money[j];        }    }    sum=has[1]+has[2]+has[3];    int l1=has[1]-x1+x3,l2=has[2]+x1-x2;    if(l1<0||l2<0||sum-l1-l2<0){        printf("impossible\n");        return 0;    }    memset(dp[0],-1,sizeof(dp[0]));    dp[0][has[1]][has[2]]=0;    for(int i=1;i<=6;i++){//6种钱        memset(dp[i&1],-1,sizeof(dp[i&1]));        for(int j1=0;j1<=sum;j1++){//两个人的钱            for(int j2=0;j1+j2<=sum;j2++){                if(dp[(i-1)&1][j1][j2]!=-1){                     for(int k1=0;k1<=mcnt[i];k1++){//这种钱两个人的数目要变成多少                        for(int k2=0;k2+k1<=mcnt[i];k2++){                            int la=j1+money[i]*(k1-cnt[1][i]);                            int lb=j2+money[i]*(k2-cnt[2][i]);                            if(la>=0&&lb>=0&&la+lb<=sum){                            int d=(abs(k1-cnt[1][i])+abs(k2-cnt[2][i])+abs(mcnt[i]-k1-k2-cnt[3][i]))/2;                            if(dp[i&1][la][lb]==-1){                                dp[i&1][la][lb]=dp[(i-1)&1][j1][j2]+d;                            }                            else {                                dp[i&1][la][lb]=min(dp[(i-1)&1][j1][j2]+d,dp[i&1][la][lb]);                            }                            }                        }                     }                }            }        }    }    if(dp[6&1][l1][l2]==-1){        puts("impossible");    }    else {        printf("%d\n",dp[6&1][l1][l2]);    }    return 0;}
0 0
原创粉丝点击