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;
}
- pku 1011 解题报告
- pku 1011 解题报告
- pku 1011 sticks 搜索+剪枝 解题报告
- pku 2975解题报告
- pku 1088 解题报告
- pku 1002 解题报告
- pku 1003解题报告
- pku 1004 解题报告
- pku 1005 解题报告
- pku 1006 解题报告
- pku 1008 解题报告
- pku 1013 解题报告
- pku 1050 解题报告
- pku 2389解题报告
- pku 1835解题报告
- pku 1489解题报告
- PKU 1086解题报告
- ACM pku 1005 解题报告
- wince软件实现重启,待机等等
- QT样式表
- 常用站点
- 郁闷
- 嵌入式Linux之我行——S3C2440上MMC/SD卡驱动实例开发讲解(一)[转]
- pku 1011 解题报告
- SSH_远程登录
- js鼠标事件大全
- 【转】C#索引器-索引器的定义
- pku 1002 487-3279
- 错误: AjaxControlToolkit requires ASP.NET Ajax 4.0 scripts. 解决方案
- Web 领域那些阴魂不散的产品,技术与思想
- HDU 1083(图论,二分匹配)
- Java相对路径读取文件