【问题标题】:How do I generate integer partitions?如何生成整数分区?
【发布时间】:2009-09-29 00:30:52
【问题描述】:

我有一个像 1,2,3 这样的数字列表,我想找到所有组合模式,这些组合模式总和为一个特定的数字,比如 5。例如:

Sum=5
Numbers:1,2,3
Patterns:

1 1 1 1 1
1 1 1 2
1 1 3
1 2 2
2 3

您可以重复数字,只要它们不超过您的总和。哪种方式最好编程?

【问题讨论】:

  • 您使用什么语言?你试过什么?你被困在哪里了?到目前为止你有什么?
  • 语言无关紧要,c、c++、c#。我有办法得到一些模式,但仍然有一些被遗漏了。我认为我们需要一个递归算法来完成这项工作
  • 你试过什么。这真的很糟糕,但是在学习编程时,让别人告诉你如何去做对你没有帮助。你需要尝试一些东西,然后看看它是否有效。顺便说一句,我们知道家庭作业是什么样子的,我们大多数人都上过大学,学习过编程 1、2、3 等。发布更多关于你想如何解决它的信息,包括代码,你会得到更多帮助。
  • 这是我们工厂建模的一部分。我已经简化了很多问题,所以如果问题看起来像家庭作业,那可能是我的运气不好。我是一名工业工程师,所以我需要一些算法方面的帮助。
  • @Spence 另一方面,通常有一个现有的算法,你不知道它叫什么。在这些情况下,询问“有没有办法做到这一点”会有所帮助,因为答案是“哦,是的,这就是 Bob 的三明治算法”,而提问者永远无法通过谷歌搜索找到这一点。

标签: algorithm combinations


【解决方案1】:

这是对变更问题的轻微修改。你应该可以找到很多关于这个问题的论文,动态规划的解决方案不会超过 20 行代码。

http://en.wikipedia.org/wiki/Change-making_problem

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      这些被称为 the partitions of a number ,您的问题似乎强加了您可以在分区中使用哪些数字的限制。

      【讨论】:

        【解决方案4】:

        这个问题被称为“双重限制整数分区”。如果“允许”总和为 5 的数字来自集合 V,则称为“乘法受限整数分区”。 Riha 和 James 有一篇论文:“算法 29:双重和多重受限分区的有效算法”《计算》第 16 卷,第 1-2 期,第 163-168 页(1976 年)。你应该阅读那篇论文并实现他们的算法。了解如何做到这一点将使您能够针对特定问题实施独特的优化。

        【讨论】:

          【解决方案5】:

          我会先从最大的数字开始递归地执行此操作。然后,每次从最高级别开始,进入与数字一样多的级别。一旦累积水平超过您的值,就下降到下一个数字。如果仍然太大(或太小),立即返回一个级别并将其减少到下一个数字,然后再从顶部开始到下一个更深的级别..

          【讨论】:

            【解决方案6】:
                public static List<List<string>> Partition(int n, int max, string prefix)
                {
            
                    if (n == 0)
                    {
                        _results.Add(prefix.Split(new char[] { ',' }).ToList());
                    }
            
                    for (int i = Math.Min(max, n); i >= 1; i--)
                    {
                        Partition(n - i, i, prefix + "," + i);
                    }
            
                    return _results;
                }
            

            【讨论】:

              【解决方案7】:

              您可以使用以下代码..它会根据您的需要为您提供准确的答案..

              void print(int n, int * a)
              
              {
                 int i ; 
              
                 for (i = 0; i <= n; i++) 
              
                 {
              
                printf("%d", a[i]); 
              
                }
              
               printf("\n"); 
              
              }
              
              
              void integerPartition(int n, int * a, int level)
              
              {
              
                 int first; 
              
                int i; 
              
                if (n < 1) 
              
               return ;    
              
               a[level] = n;
              
                print(level, a);
              
                first = (level == 0) ? 1 : a[level-1];
              
                for(i = first; i <= n / 2; i++)
              
                 {
              
                     a[level] = i; 
              
                     integerPartition(n - i, a, level + 1);
              
                 }
              
              }
              
              int main()
              
                {
              
                 int n = 10;     
              
                 int * a = (int * ) malloc(sizeof(int) * n); 
              
                 integerPartition (n, a, 0); 
              
                 return(0);
              
              }
              

              【讨论】:

                猜你喜欢
                • 2012-05-01
                • 1970-01-01
                • 2013-09-10
                • 1970-01-01
                • 2020-01-27
                • 1970-01-01
                • 1970-01-01
                • 2016-09-21
                • 2012-10-19
                相关资源
                最近更新 更多