首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。