栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【深度优先搜索】最大乘积:排列

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【深度优先搜索】最大乘积:排列

把 1 ~ 99 这 9 个数字分成两组,中间插入乘号, 有的时候,它们的乘积也只包含 1 ~ 9 这 9 个数字,而且每个数字只出现1次。

比如:

984672 * 351 = 345619872
98751 * 3462 = 341875962
9 * 87146325 = 784316925
...

符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?

注意,需要输出的是一个整数,表示那个最大的积,只输出乘积,不要输出整个算式。

dfs(cnt,mult):cnt选择次数,mult记录当前选择的数组成的乘积。

一共要做9次选择,每次做选择时只能从1~9中选,且同一路径上的数要去重。每次选择一个数后,更新mult的值,即第一操作数。

在第一操作数固定的情况下,如果要使乘积最大,那么第二操作数必须最大,所以第二操作数也可以求出,即在所有未被标记的数的组合情况的最大值。(逆序排列即可)

在一开始求出第二操作数,并判断它们的乘积是否合法,如果合法更新最大值。

注意:在每一次做选择之后都要求出第二操作数,并判断乘积是否合法。所以,这些操作在开头写,且不能用return语句返回掉,这类似求所有一组数的所有组合情况。

代码:

#include 
#include
#include
using namespace std;
vectorpath;
bool vis[11];
bool vis1[11];
long long res = 0;
int f() {
    int n = 0;
    for (int i = 9; i >= 1; i--) {
        if (vis[i] == false) {
            n = n * 10 + i;
        }
    }
    return n;
}
bool check(long long n) {
    int m = n;
    while (m) {
        if (m % 10 == 0)return false;
        if (vis1[m % 10] == true)return false;
        vis1[m % 10] = true;
        m /= 10;
    }
    for (int i = 1; i <= 9; i++) {
        if (vis1[i] == false)return false;
    }
    return true;
}
void dfs(int index, int mult) {
  //不能使用对称性
    if (index > 9)return;
    int other = f();
    long long n = mult * other;
    memset(vis1, 0, sizeof(vis1));
    if (check(n)) {
        res = max(res, n);
    }
    for (int i = 1; i <= 9; i++) {
        if (vis[i] == true)continue;
        vis[i] = true;
        dfs(index + 1, mult * 10 + i);
        vis[i] = false;
    }

}
int main()
{
    dfs(0, 0);
    cout << res;
    // 请在此输入您的代码
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/957701.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号