Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 116042 | Accepted: 26680 |
9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0
6 5
解题思路:不仅仅是单纯的递归,这个题目还涉及到一些特殊情况的判断,也就是剪枝操,否则就会超时。递归的整体思路是:在一堆木棍里面寻找备选答案的组合,成功找到一组后应该把用过的木棍排除在外继续重复这个过程。直到递归的出口:木棍被用完了并且此时的组合正好是备选答案。
// 木棍问题.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<stdio.h> #include<stdlib.h> int a[100]; bool a_[100]; int n=0; int cmp(const void *elem1,const void *elem2) //qsort比较函数 { return *(int *)elem2 - *(int *)elem1; //降序排列 } bool find_com(int ucnt,int temp,int ans) { int j=0; if(ucnt==0&&temp==0) return true;//木棍都用完了 if(temp==0) temp=ans; for(j=0;j<n;j++) { if(a_[j]==true) continue; if(a[j]>temp) continue; a_[j]=true;//规模减小 if(find_com(ucnt-1,temp-a[j],ans)) return true; a_[j]=false; if(a[j]==temp||temp==ans) break;//剪枝 } return false; } int main() { int sum=0; //freopen("in.txt","r",stdin); scanf("%d",&n); while(n!=0) { //memset(a,0,sizeof(a)); //memset(a_,false,sizeof(a_)); int i=0; int ucnt=n; sum=0; for(i=0;i<n;i++) { scanf("%d",&a[i]); sum+=a[i]; a_[i]=false; } //sort(a,a+n,cmp);//从大到小排序 qsort(a,n,sizeof(int),cmp); //对木棍进行排序 int len=a[0]; for(i=len;i<=sum;i++)//从最大的木棍开始 { if((sum%i!=0)) continue; if(find_com(ucnt,0,i))//判断i是不是解 { printf("%d\n",i); break; } } scanf("%d",&n); } return 0; }
经典递归问题--木棍POJ 1011,布布扣,bubuko.com
原文:http://blog.csdn.net/linsheng9731/article/details/23362841