【问题标题】:Max sum from unique digits唯一数字的最大总和
【发布时间】:2019-05-26 03:51:16
【问题描述】:

我在这里找到了可以由这些(用户输入)数字形成的最大总和,但用于求和的数字不应该有任何共同的数字。

  • 我们得到了n 号码。
  • 我们查看此数字的所有子集,其中每个数字出现不超过一次。
  • 对于这个子集,我们计算总和。
  • 然后我们正在寻找这些总和的最大值。

例如。输入病例数 n=5

0  1   2  3 - > 6  ( no repeated digits here ) 0+1+2+3
3  30  8  1 - > 39 ( here 3  is repeated so choose max from 3 & 30 i.e. 30) 30+8+1
11 21 31 41 - > 41 ( here 1 is repeated to all so max number will print ) 41
11 5  45 88 - > 99 ( here 5 is repeated so choose max from 45 & 5 i.e 45 ) 11+88+45
17 69 78 89 -> 147  (69 + 78) = 147 


int sum(int Ticket[], int n)
{
    int max;
    int abc;
    for (int i = 0; i <= n; i++) {
        for (int k = 0; k <= n; k++) {
            abc = Ticket[i];
            max = Ticket[i] + Ticket[i]
                int len = to_string(abc).length();

            for (int j = 0; j <= len; j++) {
                std::string nstr = std::to_string(abc);
                std::cout << "->" << nstr[j];
            }
        }
    }
return max;
}
int main()
{ 
       // n total number of array or numbers
        int max = sum(Ticket, n);
}

问题是如何检查每个数字的唯一数字并形成最大和。

【问题讨论】:

  • 嗨。发布此类问题的更好地方是code review
  • 12 23 34 45 这样的输入,看起来需要递归解决方案。
  • 你的问题到底是什么?
  • 请注意,代码块开头的四个示例给出了与问题陈述不同的算法。检查,例如,17 69 78 89
  • @chux 对于输入,如 12 23 34 45 o/p 是 68 ( 45+ 23)

标签: c++ c++11


【解决方案1】:

所有数字子集的集合大小为 2^10。

给定一个号码,你可以存储table[digits used]=value

给定一个包含一些条目和一个数字的表格,您可以为每个条目确定是否可以使用此数字。如果是这样,如果那里还没有具有更高值的条目,则添加 table[old digit and digits from number]=new sum。在执行此操作时包括 table[no digits]=0 的事实。

这将花费 O(2^n) 时间用于 O(n) 输入,因为表条目呈指数增长,但不会超过 O(n*1024),因为条目的指数增长不能超过填充整个表.

天真地,该表可以使用位掩码实现为std::unordered_map&lt; unsigned char, unsigned int &gt;

这是一个动态规划解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2020-01-08
    • 2013-10-02
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    相关资源
    最近更新 更多