标签:wan ble bre exp log 数据 span line sample
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10593 Accepted Submission(s): 3194
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,sum_len,g_num,g_len;//所有木棍总长度,目标木棍数量,目标木棍长度 4 int glen[70],vis[70]; 5 bool cmp(int a,int b) 6 { 7 return a>b; 8 } 9 int dfs(int cnt,int len,int pos) 10 { 11 if(cnt == g_num) return true;//木棍数量已经搜索到目标木棍数量 12 if(len == g_len) return dfs(cnt+1,0,0);//木棍长度等于目标木棍长度,目标木棍数量增加1,开始找下一木棒组合成目标木棒长度 13 for(int i=pos;i<n;i++)//从已经搜索到的木棒向后挑,向前挑长度大于已搜索的,直接不用向前 14 { 15 if(!vis[i]&&len+glen[i]<=g_len)//第i根木棒可以增加且没有被选 16 { 17 vis[i]=1; 18 if(dfs(cnt,len+glen[i],i+1)) return true;//增加后继续搜索 19 vis[i]=0; 20 if(len==0) return false;//剪枝!!!这步省去大量时间,将长度小于最大木棍长度的情况直接舍去 21 while(i+1<n&&glen[i+1]==glen[i]) i++;//后面跟前面长度一样,且前面失败了,直接跳 22 } 23 } 24 return false; 25 } 26 int main() 27 { 28 while(cin>>n) 29 { 30 if(n==0) 31 break; 32 sum_len=0; 33 int glong=0; 34 for(int i=0;i<n;i++) 35 { 36 cin>>glen[i]; 37 sum_len+=glen[i]; 38 } 39 for(int i=1;i<=sum_len;i++) 40 { 41 if(sum_len%i==0) 42 { 43 memset(vis,0,sizeof(vis)); 44 g_len=i;g_num=sum_len/i; 45 if(dfs(0,0,0)) 46 { 47 glong=g_len; 48 break; 49 } 50 } 51 } 52 cout<<glong<<endl; 53 } 54 return 0; 55 }
这个dfs感觉思路跟暴力差不多,如果各位大大能够有更好点的方法,请各位大大不吝赐教O(∩_∩)O!
标签:wan ble bre exp log 数据 span line sample
原文地址:http://www.cnblogs.com/forever-snow/p/7140390.html