我是真的不知道还能怎么剪了,66分求救
查看原帖
我是真的不知道还能怎么剪了,66分求救
87133
menmen庄园楼主2021/11/27 16:00

求救sos

#include <iostream>
#include <algorithm>

using namespace std;

#define MAXSIZE 70

bool f = false;
int flag[MAXSIZE] = {0}, len[MAXSIZE] = {0}, nxt[MAXSIZE] = {0};


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

void dfs(int cur_len, int tar_len, int num, const int n)
{
    if (num == n)
    {
        if (cur_len)
        {
            return;
        }
        else
        {
            f = true;
            cout << tar_len << endl;
            exit(0);
        }
    }
    for (int i = 1; i <= n; i++)
    {
        if (!flag[i])
        {
            if (cur_len + len[i] < tar_len)
            {
                flag[i] = 1;
                dfs(cur_len + len[i], tar_len, num + 1, n);
                flag[i] = 0;
                i = nxt[i];
            }
            else if (cur_len + len[i] == tar_len)
            {
                flag[i] = 1;
                dfs(0, tar_len, num + 1, n);
                flag[i] = 0;
                i = nxt[i];
            }
            else
            {
                break;
            }
        }
    }

}

int main()
{
    int n, ans;
    int sum = 0;


    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> len[i];
        sum += len[i];
    }

    sort(len + 1, len + n + 1, cmp);
    int sign = 1;
    for (int i = 2; i <= n + 1; i++)
    {
        if (len[i] != len[i - 1])
        {
            for (int j = sign; j <= i - 1; j++)
            {
                nxt[j] = i - 1;
            }
            sign = i;
        }
    }
    ans = sum;
    for (int i = len[1]; i <= sum / 2; i++)
    {
        if (sum % i) continue;
        dfs(0, i, 0, n);
        if (f)
        {
            ans = i;
            break;
        }
    }

    cout << ans << endl;

    return 0;
}
2021/11/27 16:00
加载中...