[Luogu P1120] Small wooden stick [Data Enhanced Edition]

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;
}

  

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325826007&siteId=291194637