题目描述:
给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, ... )使得他们的和等于 n。你需要让平方数的个数最少。
给出 n = 12, 返回 3 因为 12 = 4 + 4 + 4。给出 n = 13, 返回 2 因为 13 = 4 + 9。
这个题目的思路是用动态规划,设 f(n) 为所求的最少个数。 那么 f(n)=min( f(i)+f(n-i) ), 1<=i<=n,
我们不单单是要知道最小个数,还想要知道具体的数字,那么我们可以用一个二维数组来保存它们。
具体代码:
public class dtgh {
public static int[][] extendedBottomUpCutRod( int n){
int[][] s = new int[2][n + 1]; // s[0][2]保存 n 所需最少平方因子的个数,s[1][2]保存n 所需的平方因子
s[0][0] = 0;
for(int j = 1; j <= n; j++){
int q = n;
for(int i = 1; i<=j; i++){
if (i*i<=j&&q>=1+s[0][j-i*i]) {
q=1+s[0][j-i*i];
s[1][j] = i;
}
}
s[0][j] = q;
}
System.out.print("\n 最少个数: " + s[0][n]);
return s;
}
public static void printCutRodSolution( int n){
int result[][] = extendedBottomUpCutRod( n);
System.out.print("\n拆分方案方案:"+ n +"= ");
while(n > 0){
System.out.print(result[1][n]+"*"+result[1][n]);
n = n - result[1][n]*result[1][n];
if (n>0) {
System.out.print(" + ");
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
printCutRodSolution(13);
}
}
测试结果: