Отримання знань

дистанційна підтримка освіти школярів


Палочки
http://acm.pku.edu.cn/JudgeOnline/problem?id=1011

   Входные данные

   Выходные данные

   Пример входных данных

   Пример выходных данных

   Анализ условия и обсуждение идеи решения

   Пример решения на С++:

 

#include < iostream >
#include < algorithm >
#define MAXN 64
using namespace std;

int N, 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);
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;
dfs(i+1, sum+S[i], cnt);
MK[i] = false;
if (k == 0 || FLAG)
return;
}
}

int main()
{
int sum, i;

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);

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;
}
Попередня Зміст Наступна
В системі: гості - (); користувачі - (0)