pku 1011 解题报告

来源:互联网 发布:网络购物排行榜 编辑:程序博客网 时间:2024/05/19 18:12

题目: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;

}

原创粉丝点击