1 条题解

  • 0
    @ 2024-7-25 12:46:30

    参考答案:

    #include<iostream>
    
    using namespace std;
    
    const int N = 10;
    int p[N], st[N], a[N];//p存储合法情况
    int n;//  state st存储(0/1)表示每个数字是否被使用过
    int ans = 1e9;
    
    void dfs(int u)//u是暴力枚举到的位置
    {
        if (u > 6)//超过n时 是一种合法情况 直接取min
        {
            ans = min(ans, abs((p[1] + p[2] + p[3]) - (p[4] + p[5] + p[6])));
            return;
        }
        for (int i = 1; i <= 6; ++i)
        {
            if (!st[i])//如果这个数字没有使用过那么放在u这个位置
            {
                st[i] = 1;//把这个数字按死后面不能用
                p[u] = a[i];//u这个位置放i这个数字
                dfs(u + 1);//暴搜下一个位置
                //dfs结束时也就意味着这个数字放在这个位置的所有情况全部枚举完毕
                //比如这个位置放的是3, 3 2 1 ,3 1 2
                //接下来这个位置该放 2 1 的情况了而且后面位置可以放3所以st[3]=1的状态该解除了
                //所以下面恢复现场也就是以前是什么样(dfs(u+1)上面 我们限制的地方)就恢复什么样
                //pi限制的这个位置放3解除掉sti限制的以后不能放3解除掉
                p[u] = 0;
                st[i] = 0;
            }
        }
    }
    int main()
    {
        for (int i = 1; i <= 6; ++i) cin >> a[i];
    
        dfs(1);
        cout << ans << endl;
    
        return 0;
    }
    
    • 1

    信息

    ID
    37
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    10
    已通过
    3
    上传者