您的位置:首页 > 其它

PKU 1011

2014-04-18 15:40 288 查看
#include <iostream>
#include <algorithm>
#include<fstream>
#include<string.h >
#define MAXN 64
using namespace std;

int N, LEN, M;   //LEN为原始棍子长度, M为原始棍子数量
int S[MAXN], MK[MAXN];
bool FLAG;

int cmp(int a, int b)
{
return a > b;
}

void dfs(int k, int sum, int cnt)
{
if (cnt == M)									//当前个数为棒子的个数
FLAG = true;
else if (sum == LEN)
dfs(0, 0, cnt+1);							//有cnt个棒子的长度为len,即为所需要的长度
else
for (int pre = -1, i = k; i < N; i++)
if (!MK[i] && S[i]!=pre && S[i]+sum<=LEN)
{
pre = S[i];
MK[i] = true;						//MK[]数组将已经遍历的棒子进行记录,下一次访问时,跳过这根棒子,对下一根棒子进行查找,搜索
dfs(i+1, sum+S[i], cnt);
MK[i] = false;
if (k == 0 || FLAG)
return;
}
}

int main()
{
int sum, i;
freopen("data_sticks.txt","r",stdin);
while (scanf("%d", &N) != EOF && N)
{
FLAG = false;
sum = 0;
for (i = 0; i < N; i++)
{
scanf("%d", &S[i]);
sum += S[i];
}
sort(S, S+N, cmp);					//将S[]数组从大到小排序,以此得到在得到长度的最小值之后跳出循环
cout<<S[0]<<endl;
for (LEN = S[0]; LEN < sum; LEN++)
if (sum % LEN == 0)
{
M = sum / LEN;				//棒子的长度都相等,在这里求出棒子的个数
memset(MK, 0, sizeof(MK));
dfs(0, 0, 0);
if (FLAG)					//在得到最小值后直接跳出循环
break;
}
printf("%d\n", FLAG? LEN : sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: