【问题标题】:Count Integer partitions possible for a range计算一个范围内可能的整数分区
【发布时间】:2017-07-10 18:49:54
【问题描述】:

问题陈述:

给你两个数,分别是 A 和 S。编写一个程序,找出大于或等于 S 的数相加得到总和 A 的方式数。将结果打印为模 10 ^9+9。

例如如果 A 为 3 且 S 为 1,则有三种方法可以使用大于等于 S=1 的数字来实现 A=3。解决方案是 、 和 。 对于 A=9 和 S=3,解决方案将是 、、 和 。使用大于等于 3 的数字,共有 4 种方法得到 9。

我使用了以下方法。

  1. 检查 (S>A/2) 是否只有一种解决方案。例如,如果 A=9 并且 S=5 那么只有一种解决方案是可能的,即 。
  2. 如果条件 1 不成立,则创建一个列表并存储所有符合条件的 i S
  3. 对于列表中的每个数字 i。

    3.1。而 A>=i

    3.1.1。将 A 减 i。

    3.1.2。如果 A>=i 则递增 count(count 存储总排列并且是 初始设置为 1)。

    3.1.3。 else 退出 while 循环。

这种方法具有二次时间复杂度。有没有更好的方法来解决这个问题?

【问题讨论】:

  • 假设 A >= S。你可以拥有的最大整数个数是 k = floor(A/S) >= 1,最小值是 1。让我们考虑一组 r 个整数, 1 en.wikipedia.org/wiki/Partition_%28number_theory%29
  • @DaveGalvin 感谢维基百科链接。对于 A=9 和 S=3,解决方案将是 、、 和 。但是使用您指定的方法我的 k=floor(9/3)=3。整数 r 的范围从 1 到 3。这样我只能得到解 、。我将如何获得第 4 个解决方案 ?
  • @jaikishan_gurav 不,对于 r=2,您从 开始,剩下 3 个,然后计算将这三个球分配到两个箱子的不同方式的数量。这给了你 3,0 和 2,1。然后将这些添加到 给你 和 。困难的部分是计算将相同的球分配到相同的箱子的方法的数量。

标签: algorithm


【解决方案1】:

我能够使用动态编程解决这个问题。这个问题类似于硬币找零问题,其中 sum 是我们拥有的总金额,而 d,d+1,d+2,..,sum 是我们可以用来实现 sum 的硬币。下面是我写的java代码。

private static int countPartitionsDP(int d, int sum){
    if(d>sum/2)
        return 1;
    if(d>sum)
        return 0;
    int coins=sum-d+1;
    int[][] dp=new int[coins][sum+1];
    for(int i=0;i<coins;i++){   //for sum=5 and d=2 number that we use to achieve sum is 2,3,4,5 i.e (i+d).
        for(int j=0;j<=sum;j++){
            if(j==0)    //sum=0 can be achieved in 1 way. dp[i][0]=1
                dp[i][j]=1;
            else if(i==0){
                if(j<(i+d)){    //if current sum j is less than current value of d i.e.(i+d).
                    dp[i][j]=0;
                }else{
                    dp[i][j]=dp[i][j-i-d];  //if sum is greater than current value of d then dp[i][j]=dp[i][j-d]
                }
            }else if(j<(i+d)){
                dp[i][j]=dp[i-1][j];
            }else{
                dp[i][j]=dp[i-1][j]+dp[i][j-i-d];
            }
        }
    }
    return dp[coins-1][sum];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2020-05-05
    • 2013-06-12
    相关资源
    最近更新 更多