sticks
来源:互联网 发布:stc编程器大全 编辑:程序博客网 时间:2024/06/05 19:05
题意:给出最多64根短木棍,求其能恢复出相同长度的木棍的情况下最短木棍长度。
#include<iostream>#include<algorithm>#include<cmath>#include<cstdio>#include<cstring>#include<malloc.h>using namespace std;int n,sum,m,cur;int go[66];bool vis[66];bool cmp(int a,int b){return a>b;}bool dfs(int p,int res,int left){if (left==cur) return true;for (int i=p+1;i<n;i++) if (res+go[i]<=cur && !vis[i]){vis[i]=true; // 用于记录是否已经被用if (res+go[i]==cur) {if (dfs(-1,0,left-cur)) return true;}else if (dfs(i,res+go[i],left)) return true;vis[i]=false;if (res+go[i]==cur) return false; // 如果以后根没有凑好,则表示一直会凑不好if (res==0) return false;while (go[i+1]==go[i]) i++; //相邻相同长度木棍情况排除}return false;}int main(){freopen("in","r",stdin);int i,j,k;while (cin>>n,n){m=sum=0;for (i=0;i<n;i++) scanf("%d",go+i),sum+=go[i],m=max(m,go[i]);sort(go,go+n,cmp); // 排序很关键go[n]=-1;memset(vis,false,sizeof(vis)); for (cur=m;cur<=sum;cur++) if (!(sum%cur)) // 去除不可能恢复出的单根木棍的长度{if (dfs(-1,0,sum)){printf("%d\n",cur);break;}}}}
0 0
- Sticks
- sticks
- sticks
- sticks
- Sticks
- sticks
- Sticks
- Sticks
- Sticks
- Sticks
- Sticks
- Sticks
- Sticks
- Sticks
- Sticks
- sticks
- Sticks
- 1011 Sticks
- apache如何一个ServerName对应多个DocumentRoot
- C语言学习笔记与总结(一)
- 易则易知,简则易从
- 配置寄存器命令
- uva10106 - Product
- sticks
- C++类构造函数初始化列表
- [LeetCode] Generate Parentheses
- 数据库表设计时应当建立主外键关系
- hdu1874
- jsp 自定义标签
- C语言 数组指针和指针数组
- 二维子数组之和的最大值
- 34. 堆排序