如何在没有耗尽循环的程序中经历多种可能性,该数字的正确除数(除数包括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。
答案 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);
}
但老实说,这不是编程问题,而是更多的数学方法问题: - )