hdu 3576

来源:互联网 发布:三维软件介绍 编辑:程序博客网 时间:2024/06/06 14:09
题意:略


思路:如果几个人的同一层下楼的话 这个电梯只要停一次,不同的电梯就各加1,用三维dp记录。状态表示当前电梯人数,记下最优值。


#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>using namespace std;int dp[50][50][50];// 电梯容量 电梯人数int a[20];int main(){    int t,cas=1,c,m,x,sum;    scanf("%d",&t);    while(t--)    {        memset(a,0,sizeof(a));        memset(dp,0x3f,sizeof(dp));        scanf("%d%d",&c,&m);        for(int i=0;i<m;i++)        {            scanf("%d",&x);            a[x]++;        }        dp[0][0][0]=0;        sum=0;        for(int i=2;i<=16;i++)        {            if(!a[i])continue;            for(int j=c;j>=0;j--)            {                for(int k=c;k>=0;k--)                {                    for(int l=c;l>=0;l--)                    {                        if(j+k+l!=sum)continue;                        for(int u=0;u<=a[i];u++)                        {                            for(int g=0;g+u<=a[i];g++)                            {                                x=0;                                if(u!=0)                                    x++;                                if(g!=0)                                    x++;                                if(a[i]-u-g!=0)                                    x++;                                dp[j+u][k+g][l+a[i]-u-g]=min(dp[j][k][l]+x,dp[j+u][k+g][l+a[i]-u-g]);                            }                        }                    }                }            }            sum+=a[i];        }        int ans=20000;        for(int j=c;j>=0;j--)        {            for(int k=c;k>=0;k--)            {                for(int l=c;l>=0;l--)                {                    if(j+k+l==m)                        ans=min(ans,dp[j][k][l]);                }            }        }        printf("Case %d: %d\n",cas++,ans);    }    return 0;}


0 0
原创粉丝点击