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;
}

 

posted @ 2016-11-02 19:27  N维解析几何  阅读(488)  评论(0编辑  收藏  举报