题目:Sticks
题意:已经知道了一大堆被切割好的木块,求这堆木块是从哪个最小长度的木块切割出来的。
解决方法:模拟,排序
难度:对我来说很难。。嘿嘿
代码:(来源:《程序设计导引及在线实践》)
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a,const void *b)//将切割好的木块从大到小的排列。
{
return *(int *)b -*(int *)a;
}
int s[101];
int used[101];
int ok(int n,int non,int left,int len)//对是否符合要求的长度进行判断 参数意义:木块个数,剩余的木块个数,验证中剩余的木块的长度,可能是所求的长度
{
int i;
if(non==0 && left==0)
return 1;
if(left==0)
left=len;
for(i=0;i<n;i++) //开始构建到原木块的长度
{
if(used[i]==1) //该木块长度已经被使用了
continue;
if(s[i]>left)//该木块大于了已经开始拼接的剩下的长度
continue;
used[i]=1;//该长度的木块被使用了
if(ok(n,non-1,left-s[i],len))//进入递归判断
return 1;
used[i]=0;//如果不符合重新将其定为未使用
if( s[i]==left || left==len)//其他一些不可能在该len下实现拼接的情况,测试过将该代码删除,将TLE
break;
}
return 0;
}
int main()
{
int k,i;
long sum;
while(scanf("%d",&k),k)
{
sum=0;
for(i=0;i<k;i++)
{
scanf("%d",&s[i]);
used[i]=0;
sum+=s[i];
}
qsort(s,k,sizeof(int),cmp);
for(i=s[0];i<=sum;i++)//从最长的木块的长度开始模拟直到木块总长
{
if(sum%i!=0)
continue;
if(ok(k,k,0,i))
{
printf("%d/n",i);
}
}
}
return 0;
}