一天不A浑身难受


私信TA

用户名:w135353079

访问量:268

签 名:

等  级
排  名 3955
经  验 1724
参赛次数 1
文章发表 1
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

解题思路:

记录一个最大值,如果当前搜索过程中的最大值 + 剩下层数 * maxv <= res  

则不可能更新最大值  , 直接return
    故只需要加一句剪枝代码:

    if (s + (n - x + 1) * maxv <= res)

        return;



参考代码:


#include <iostream>

#include <algorithm>

#include <cstring>

#include <cmath>

#include <queue>

using namespace std;

typedef long long LL;

const int N = 15;


int g[N][N];

int n;

bool st[N];//第i列的人是否选择

int maxv;

int res;

void dfs(int x,int s)//第x行,总和为s

{

    if (x > n)

    {

        res = max(res,s);

        return;

    }

    if (s + (n - x + 1) * maxv <= res)

        return;

    for (int i = 1 ; i <= n ; i ++)

    {

        if (st[i]) continue;

        st[i] = 1;

        dfs(x + 1,s + g[x][i]);

        st[i] = 0;

    }

}


int main()

{

    cin >> n;

    

    for (int i = 1 ; i <= n ; i ++)

    for (int j = 1 ; j <= n ; j ++)

    {

        cin >> g[i][j];

        maxv = max(g[i][j],maxv);

    }

    

    dfs(1,0);

    

    cout << res << endl;

    return 0;   

}


 

0.0分

1 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区