【问题标题】:Number of sets for which there exists a unique subset for all number from 1 to n such that sum of elements of subset is equal to the number对于从 1 到 n 的所有数字存在唯一子集的集合数,使得子集的元素之和等于该数字
【发布时间】:2013-07-15 14:27:43
【问题描述】:

给定一个数字 n,我们必须找到集合的数量,使得从 1 到 n 的每个数字都可以唯一通过添加该集合的一些元素而形成,并且该集合的数字总和必须等于n。例如,如果 n=5,则 {1,1,1,1,1}, {1,2,2}, {1,1,3} 有效,{1,1,1,2} 无效,因为 3 = 1 + 1 + 1 和 3 = 1 + 2 即 3 不是唯一形成的。{1,2,4} 也是无效的,因为即使从 1 到 4 的所有数字都是唯一形成的,它的元素总和不是 7 5. 这是 CodeChef(Money Matters) 的问题表。我已经看到了一些答案,但仍然无法解决。有人可以给我一些提示或方向吗?
n 范围:n

【问题讨论】:

    标签: set-theory


    【解决方案1】:

    想象一个 N × N 矩阵,其中每个元素最多为 N。用 2 个循环构建这个矩阵。那么每一行总和为 N 就是一个解。

    当 N = 5 构建时:

    0 0 0 0 0
    0 0 0 0 1
    0 0 0 0 2
    0 0 0 0 3
    0 0 0 0 4
    0 0 0 0 5 SOLUTION
    0 0 0 1 1
    0 0 0 1 2
    0 0 0 1 3
    0 0 0 1 4 SOLUTION 
    0 0 1 0 1 
    etc.
    

    【讨论】:

    • n 的范围对于矩阵来说太高了
    • 矩阵只是一个概念。根据定义,您必须能够为具有 N 个元素的集合返回 {1,1,1,1....1,1} 的集合。因此,可以测试 N X N 个元素的二维数组,以查看数组的哪些行的总和为 N。
    • 但仍然检查需要 n^2 次计算,这将花费大量时间。另外我认为你误解了这个问题,不仅元素的总和必须是 n,而且从 1 到 n-1 的数字应该使用集合唯一地形成
    • 您可以在检查时排除重复项。而且您的原始帖子没有指定解决方案需要高性能。会有很多解决方案。我认为你需要以一种或另一种方式强制它。你要求提示和方向。我想我两者都提供了。
    • 蛮力将花费指数时间,因为可能性的总数为 2^n,然后对于每种情况,我们必须检查它是否满足给定条件,因此 n = 10^9 的总运行时间将为以年为单位。
    【解决方案2】:

    一些递归可能会有所帮助:

    function GetSets(int TotalToHit)
    {
       solutions += {TotalToHit};
       for int i = 1; i <= TotalToHit / 2; i ++
       {
         solutions += { i, GetSets(TotalToHit - i) };
       }
    
       return solutions;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多