dfs不同处,有不同结果
  • 板块P1120 小木棍
  • 楼主JMXZ
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/8/15 10:53
  • 上次更新2023/11/4 10:37:21
查看原帖
dfs不同处,有不同结果
421608
JMXZ楼主2021/8/15 10:53
//LOJ 10020 #10020. 「一本通 1.3 例 3」小木棍
//dfs不同处,有不同结果

#include <cstdio>
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int maxn = 105;

int n, a[maxn], sum, used[maxn], minn, m, bj, len;

bool cmp(const int &x, const int &y) {
    return x > y;
}

void dfs(int k, int last, int rest)
{

    if (k == m) 
    {
        bj = 1;
        return;
    }

    int i;
    if (rest == 0) 
    {
        for ( i = 1; i <= n; i++) 
        {
            if (used[i] == 0) 
            {
                used[i] = 1;
                break;
            }
            //dfs(k + 1, i, len - a[i]);//有一个TLE+WA
        }
        dfs(k + 1, i, len - a[i]);//一个WA
    }
    //dfs(k + 1, i, len - a[i]);//SF

    for (int i = last + 1; i <= n; i++) 
    {
        if (used[i] == 0 && rest >= a[i]) 
        {
            used[i] = 1;
            dfs(k, i, rest - a[i]);

            used[i] = 0;

            //

            int j=i;//
            while (i<n&&a[j] == a[i])   i++;//

            if(i==n) return ;//

        }

    }
}

int main() {
    cin >> n;

    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        sum += a[i];
        minn = max(minn, a[i]);
    }

    sort(a + 1, a + 1 + n, cmp);
    //for(int i=1;i<=n;i++) cout<<a[i]<<" ";
    //cout<<minn<<sum;

    for (int i = minn; i <= sum; i++) {

        if (sum % i == 0) {
            memset(used, 0, sizeof(used));

            len = i;

            bj = 0;
            m = sum / i;
            used[1] = 1;

            dfs(1, 1, len - a[1]); //

            if (bj == 1) {
                cout << len << endl;
                break;
            }
        }

    }

    return 0;
}
2021/8/15 10:53
加载中...