如何在不耗尽循环的情况下经历多种可能性?

时间:2016-01-20 14:58:01

标签: java

  

如何在没有耗尽循环的程序中经历多种可能性,该数字的正确除数(除数包括1但不是除数)的总和大于数字,但这些除数的子集不是数字本身的总和

例如:

12 =(因子总和)1 + 2 + 3 + 4 + 6

Atleast任何子集总和应该等于数字,在这种情况下为12。

问题链接 :http://www.practice.geeksforgeeks.org/problem-page.php?pid=301

方法:

Step1(怀疑)

通过查看问题,我发现它的最佳解决方案是动态编程。(因为我不知道)。

除此之外,我想到了像这样的解决方案

例12 = 1,2,3,4,6(除数)

所以,通过这样解决它,1开始具有所有排列:1 + 2 + 3 + 4 + 6或1 + 3 + 4 + 6或1 + 4 + 6或1 + 6(在每一步检查是否它是< = 12。

同样,我从2:2 + 3 + 4 + 6或2 + 4 + 6开始检查(我得到并移出循环)

我在想的解决方案很长。我必须为每个数字设置单独的循环,并且我将除数保存在字符串中。

  

任何人都可以给我" Hint"如何在没有动态编程(Dp)方法的情况下启动问题,因为这些天我正在学习Dp。

1 个答案:

答案 0 :(得分:1)

我假设你有一个方法

int[] getDivisors(int number)

这里的艰巨任务是评估可能的总和。 一个简单而漫长的方法是迭代所有这样的人。 可以将这样的总和想象成二进制代码,如果是总和,则为1,如果不是则为0。 现在你可以编写一个for循环,从0 ... 0到1 ... 1(二进制),#1s = divisors.length; 也许更好的方法是递归方法。像:

boolean hasSameSum(int number, Stack<Integer> divisors, int sum){
    if(sum==number)
         return false;
    if(divisors.isEmpty())
         return true;
    int div = divisor.pop();
    return hasSameSum(number, divisors, sum)&&hasSameSum(number, divisors, sum+div);
}

但老实说,这不是编程问题,而是更多的数学方法问题: - )