我会这样处理:
首先,概括问题。您可以定义一个功能
printPartitions(int target, int maxValue, string suffix)
规格:
打印目标的所有整数分区,后跟后缀,以使分区中的每个值最多为maxValue
请注意,始终至少有1个解决方案(假设target和maxValue均为正),全为1。
您可以递归使用此方法。因此,首先考虑一下基本情况:
printPartitions(0, maxValue, suffix)
应该简单地打印
suffix。
如果
target不是
0,则必须选择:不使用
maxValue(如果
maxValue >target只有一个选项:不要使用)。如果你不使用它,你应该降低
maxValue的
1。
那是:
if (maxValue <= target) printPartitions(target-maxValue, maxValue, maxValue + suffix);if (maxValue > 1) printPartitions(target, maxValue-1, suffix);
结合所有这些,就可以得到一个相对简单的方法(这里用Java编码,我对语句进行了一些重新排序,以获得与您描述的完全相同的顺序):
void printPartitions(int target, int maxValue, String suffix) { if (target == 0) System.out.println(suffix); else { if (maxValue > 1) printPartitions(target, maxValue-1, suffix); if (maxValue <= target) printPartitions(target-maxValue, maxValue, maxValue + " " + suffix); }}您可以简单地称其为
printPartitions(4, 4, "");
哪个输出
1 1 1 1 1 1 2 2 2 1 3 4



