洛谷 P1120 小木棍

题意简述

给出n个数,求最小的l,使n个数可分成若干组,每组和都为l。

题解思路

暴力搜索+剪枝

代码

#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int n, sum, minn, maxx;
int t[70];
void dfs(int gs, int last, int sy, int qb)
{
    if (gs == 0)
    {
        printf("%d\n", qb);
        exit(0);
    }
    if (sy == 0)
        dfs(gs - 1, maxx, qb, qb);
    bool flag = true;
    for (int i = min(last, sy); i >= 1; --i)
        if (t[i] > 0)
        {
            flag = false;
            t[i] --;
            dfs(gs, i, sy - i, qb);
            t[i] ++;
            if (i == sy || sy == qb)
                return;
        }
    if (flag)
        return;
}
int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
    {
        int x;
        scanf("%d", &x);
        if (x <= 50)
        {
            t[x] ++;
            sum += x;
            maxx = max(maxx, x);
        }
    }
    for (int i = maxx; i <= sum; ++i)
        if (sum % i == 0)
            dfs(sum / i, maxx, i, i);
}

猜你喜欢

转载自www.cnblogs.com/xuyixuan/p/9429558.html