pku1011
来源:互联网 发布:淘宝开店做什么产品好 编辑:程序博客网 时间:2024/06/09 19:48
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int totLen,len,maxL,n,i,k;
int s[64];
int used[64];
int cmp(const void * a, const void * b)...{
return (*(int *)b) - (*(int *)a);
}
bool Search(int times,int rest,int pos)...{
int flag=0;
if(rest == len) flag = 1;
if(times==totLen/len)
return 1;
int i;//尽量用局部变量
for(i=pos;i<n;i++)...{
if(used[i])
continue;
if(s[i]==rest)...{
used[i]=1;
if(Search(times+1,len,0))
return 1;
used[i]=0;//大的刚好匹配的s[i]不能填入,不必再考虑更小的了.因若s[j]+s[k](j,k<i)
//填入前面的棍(s[j]+s[k]==s[i])、s[i]填入后面的棍可行,则s[j]+s[k]与s[i]调换肯定也ok
return 0;
}
else if(s[i]<rest)...{
used[i]=1;
if( Search(times,rest-s[i],i+1) )return 1;
used[i]=0;
if(flag) return 0; //因为rest==len的情况下(新棍开始),s[i]一定要
//被用上(s[i]是从0开始第一个未被用过的小棒),但找不到解,说明此时len不是解
while(s[i+1]==s[i])i++;
}
}
return 0;
}
int main()
...{
int len1;
while( scanf("%d",&n),n>0 )...{
memset(s,0,sizeof(s));
maxL=-1,totLen=0;
for(i=0;i<n;i++)...{
scanf("%d",&s[i]);
totLen+=s[i];
if(s[i]>maxL)
maxL=s[i];
}
qsort(s,n,sizeof(s[0]),cmp);
for(len1=maxL;len1<=totLen;len1++)...{
if(totLen%len1!=0)
continue;
len=len1;
memset(used,0,sizeof(used));
if(Search(1,len1,0))...{
printf("%d ",len1);
break;
}
}
}
return 1;
}
#include <stdlib.h>
#include <memory.h>
int totLen,len,maxL,n,i,k;
int s[64];
int used[64];
int cmp(const void * a, const void * b)...{
return (*(int *)b) - (*(int *)a);
}
bool Search(int times,int rest,int pos)...{
int flag=0;
if(rest == len) flag = 1;
if(times==totLen/len)
return 1;
int i;//尽量用局部变量
for(i=pos;i<n;i++)...{
if(used[i])
continue;
if(s[i]==rest)...{
used[i]=1;
if(Search(times+1,len,0))
return 1;
used[i]=0;//大的刚好匹配的s[i]不能填入,不必再考虑更小的了.因若s[j]+s[k](j,k<i)
//填入前面的棍(s[j]+s[k]==s[i])、s[i]填入后面的棍可行,则s[j]+s[k]与s[i]调换肯定也ok
return 0;
}
else if(s[i]<rest)...{
used[i]=1;
if( Search(times,rest-s[i],i+1) )return 1;
used[i]=0;
if(flag) return 0; //因为rest==len的情况下(新棍开始),s[i]一定要
//被用上(s[i]是从0开始第一个未被用过的小棒),但找不到解,说明此时len不是解
while(s[i+1]==s[i])i++;
}
}
return 0;
}
int main()
...{
int len1;
while( scanf("%d",&n),n>0 )...{
memset(s,0,sizeof(s));
maxL=-1,totLen=0;
for(i=0;i<n;i++)...{
scanf("%d",&s[i]);
totLen+=s[i];
if(s[i]>maxL)
maxL=s[i];
}
qsort(s,n,sizeof(s[0]),cmp);
for(len1=maxL;len1<=totLen;len1++)...{
if(totLen%len1!=0)
continue;
len=len1;
memset(used,0,sizeof(used));
if(Search(1,len1,0))...{
printf("%d ",len1);
break;
}
}
}
return 1;
}
- pku1011
- pku1011
- pku1011
- PKU1011 Sticks
- PKU1011解题ing
- PKU1011 Sticks 经典DFS(TLE了。。没办法)
- PKU1011“Stick”这道我的想法是贪心加深搜。两重递归,可惜超时了!
- 用jsp进行数据分页显示的一个实现
- Linux信号列表
- ie developer toolbar,IE6/IE7下的FireBug
- 海量数据库的 查询优化及分页算法方案
- 关于Servlet中的相对路径和绝对路径归纳
- pku1011
- ASP.NET实现投票结果的图片进度条显示
- 未知错误 ID:-2147467259 "操作必须使用一个可更新的查询"
- 从NT4.0域升级至WINDOWS2003AD手记
- C语言写的菜单"类"
- 互相联系的 new 和 delete 要使用同样的形式
- 毕业了
- HTML 4.0 语 法 教 学
- 无间断上下滚动