POJ1014 Dividing 题解&代码

来源:互联网 发布:制作证件照软件 编辑:程序博客网 时间:2024/04/30 04:05

二进制优化写跪好几次感觉有点醉= =果然是好久没写dp都忘了

#include<iostream>#include<stdio.h>#include<string.h>using namespace std;bool flag;int T,a[10],dp[60005],tot,now,temp,x;int main(void){    while(true)    {        flag=false;tot=0;now=0;        for(int i=1;i<=6;i++)        {            scanf("%d",&a[i]);            tot+=a[i]*i;        }        if(!tot)break;        if(tot%2)flag=false;        else        {            tot/=2;            memset(dp,0,sizeof(dp));            dp[0]=1;            for(int i=1;i<=6;i++)            {                x=1;                for(;a[i]>0;)                {                    for(int k=now;k>=0;k--)                    if(dp[k])                    {                        temp=k+i*min(a[i],x);                        if(temp<=tot)                        {                            dp[temp]=1;                            if(temp==tot)                            {                                flag=true;                                break;                            }                            now=max(now,temp);                        }                    }                    a[i]-=x;x<<=1;                    if(flag)break;                }                if(flag)break;            }        }        printf("Collection #%d:\n",++T);        if(flag)printf("Can be divided.\n\n");        else printf("Can't be divided.\n\n");    }    return 0;}
0 0
原创粉丝点击