题意:有一些被打乱的木棒,每个木棒长度不一样,问能够将这些木棒链接成长度相等的一根或者多根木棒最短的长度是多少。
思路:对每一个长度进行一次DFS,如果只是这样会超时,所以需要一个剪枝,每次DFS的时候如果发现有某一根不能用的时候就直接跳出,这样才能保证不会超时。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[100],vis[100]; int n,p,sum,mi; bool cmp(int x,int y){ return x>y; } bool dfs(int len,int cnt,int cur){ if(cur==len) return true; if(cnt==p) return true; for(int i=1;i<=n;i++) if(!vis[i]){ if(cur+a[i]==len){ vis[i]=1; if(dfs(len,cnt+1,0)) return true; vis[i]=0; return false; } else if(cur+a[i]<len){ vis[i]=1; if(dfs(len,cnt,cur+a[i])) return true; vis[i]=0; if(cur==0) return false;//剪枝:这种情况下证明第i根木棒没有被使用。 } } return false; } int main(){ while(~scanf("%d",&n)){ if(n==0) break; mi=0, sum=0; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); mi=max(mi,a[i]); sum+=a[i]; } sort(a+1,a+1+n,cmp); for(int i=mi;i<=sum;i++){ if(sum%i==0){ p=sum/i; memset(vis,0,sizeof(vis)); if(dfs(i,0,0)){ printf("%d ",i); break; } } } } return 0; }