Topic: There are some sticks of the same length, cut into pieces (length $\leqslant$50). Given the length of each small stick, find the smallest possible length of the original stick.
Solution: dfs
C++ Code:
#include<cstdio> #include<cstdlib> int n,sum,max,min=0x3f3f3f3f,x; int num[100]; void dfs(int res,int sum,int tar,int now) { if (res==0){printf("%d\n",tar);exit(0);} if (sum==tar){dfs(res-1,0,tar,max);return;} for (int i=now;i>=min;i--) if (num[i]&&i+sum<=tar){ num[i]--; dfs(res,sum+i,tar,i); num[i]++; if (sum==0||sum+i==tar)break; } } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d",&x); if (x<=50){ num[x]++; sum+=x; if (x>max)max=x; if (x<min)min=x; } } int tmp=sum>>1; for (int i=max;i<=tmp;i++)if (sum%i==0)dfs(sum/i,0,i,max); printf("%d\n",sum); return 0; }