题意:给出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;
}
原文:http://www.cnblogs.com/jihe/p/6024135.html