USACO1.6 Healthy Holsteins【dfs/bfs 爆搜】
饲料种数只有15 枚举每种选或不选一共也就只有$2^{15}=32768$ 爆搜可过
觉得bfs要快一些? 但是dfs更方便处理字典序 只需要顺序遍历并且先搞选它的情况就可以了
而且在这种规模的数据下我们也不需要它跑得很快对吧(笑)
1 /* 2 ID: Starry21 3 LANG: C++ 4 TASK: holstein 5 */ 6 #include<iostream> 7 #include<string> 8 #include<cstdio> 9 #include<cstring> 10 #include<vector> 11 #include<algorithm> 12 #include<queue> 13 using namespace std; 14 #define N 30 15 #define ll long long 16 #define INF 0x3f3f3f3f 17 int n,nd[N],g,aln[N][N];/*afternative*/ 18 int cv[N];/*chosen value*/ 19 bool cs[N]/*chosen*/,res[N]; 20 int ans=INF; 21 bool check() 22 { 23 for(int i=1;i<=n;i++) 24 if(cv[i]<nd[i]) 25 return 0; 26 return 1; 27 } 28 void dfs(int k,int num) 29 { 30 //被注释的部分可以互相替代吧 觉得没被注释的要快一些 相当于剪枝吧 31 /*if(k>g) 32 { 33 if(check()&&num<ans) 34 { 35 ans=num; 36 memcpy(res,cs,sizeof(cs)); 37 } 38 return ; 39 }*/ 40 if(check()) 41 { 42 if(num<ans) 43 { 44 ans=num; 45 memcpy(res,cs,sizeof(cs)); 46 } 47 return ; 48 } 49 if(k>g) return ; 50 51 52 for(int i=1;i<=n;i++) 53 cv[i]+=aln[k][i]; 54 cs[k]=1; 55 dfs(k+1,num+1); 56 for(int i=1;i<=n;i++) 57 cv[i]-=aln[k][i]; 58 cs[k]=0; 59 dfs(k+1,num); 60 return ; 61 } 62 int main() 63 { 64 //freopen("holstein.in","r",stdin); 65 //freopen("holstein.out","w",stdout); 66 scanf("%d",&n); 67 for(int i=1;i<=n;i++) 68 scanf("%d",&nd[i]); 69 scanf("%d",&g); 70 for(int i=1;i<=g;i++) 71 for(int j=1;j<=n;j++) 72 scanf("%d",&aln[i][j]); 73 dfs(1,0); 74 printf("%d",ans); 75 for(int i=1;i<=g;i++) 76 if(res[i]) printf(" %d",i); 77 puts(""); 78 return 0; 79 }
转载请注明出处,有疑问欢迎探讨
博主邮箱 2775182058@qq.com