首页 > 代码库 > hdu 5937

hdu 5937

题意:给出1-9的个数,然后组成a+b=c的式子(1<=a,b,c<=9),这样的式子有多少个?

算一下,有36个,满36个需要用到的ai的个数是17-i,先判满不满,num[i]=min(num[i],17-i),多于限制个没什么用,然后真的只要爆搜就行了,不敢相信自己的眼睛

#include<bits/stdc++.h>using namespace std;const int maxn=500;int a[10],ans;int d[36][3];map<int,int> vis;void init(){    int cnt=0;    for(int i=1;i<9;i++)    for(int j=1;j+i<10;j++){        d[cnt][0]=i;        d[cnt][1]=j;        d[cnt][2]=i+j;        vis[i]++;vis[j]++;vis[i+j]++;        cnt++;    }    //printf("%d\n",cnt);    //for(int i=1;i<=9;i++)cout<<i<<" "<<vis[i]<<endl;}inline bool judge(int p){    if(a[d[p][0]]>=0&&a[d[p][1]]>=0&&a[d[p][2]]>=0)return true;    return false;}inline void ss(int p,int val){    a[d[p][0]]+=val;a[d[p][1]]+=val;a[d[p][2]]+=val;}void dfs(int dep,int now,int sz){    if(36-dep+now<=ans||dep>=36)return ;    ss(dep,-1);    if(judge(dep)){        ans=max(ans,now+1);        dfs(dep+1,now+1,sz-3);    }    ss(dep,1);    dfs(dep+1,now,sz);}int main(){    init();    int t,cas=1,cnt;    scanf("%d",&t);    while(t--){        cnt=0;bool ok=1;        for(int i=1;i<=9;i++){            scanf("%d",a+i);            a[i]=min(a[i],17-i);            if(a[i]<17-i)ok=0;            cnt+=a[i];        }        if(ok)ans=36;        else{            ans=0;            dfs(0,0,cnt);        }        printf("Case #%d: %d\n",cas++,ans);    }    return 0;}

 

hdu 5937