// Dynamic Programming
using System.IO;
using System;
class Program
{
static void Main()
{
Console.WriteLine("Hello, World!");
int val = 12;
int[] table = new int[val+1];
table[0] = 0;
for ( int i=1; i<=val; i++){
int maxsqrt = (int) Math.Sqrt(i);
int localmin = i;
for (int j=1; j<=maxsqrt; j++){
if ( table[i-j*j] < localmin) {
localmin = table[i-j*j];
}
}
table[i] = localmin + 1;
}
Console.WriteLine("Min Val:"+ table[val]);
}
}
我在网上找到了以下问题的解决方案:
给出一个数字&#34; n&#34;,找到获得&#34; n&#34;所需的最小数量的完美平方数和。
实施例: n = 12,返回3(4 + 4 + 4)=(2 ^ 2 + 2 ^ 2 + 2 ^ 2)NOT(3 ^ 2 + 1 + 1 + 1) n = 6,返回3(4 + 1 + 1)=(2 ^ 2 + 1 ^ 2 + 1 ^ 2)
我无法理解代码。
答案 0 :(得分:0)
这基本上是递归解决方案的有效实现:
f(x) = min{ f(x-1^2), f(x-2^2) , ..., f(x-floor(sqrt(x))^2) } + 1
这基本上是解决问题的强力解决方案
答案 1 :(得分:0)
找到另一种解决问题的简单方法:
import java.util.*;
class Program2{
int[] min;
Program2(){
min = new int[13];
Arrays.fill(min, Integer.MAX_VALUE);
}
public void findMin(int n){
min[0] = 0;
for(int i=1 ; i<=n ; i++){
for(int j=1 ; j*j<=i ; j++){
min[i] = Math.min(min[i], min[i - j*j] + 1);
}
}
}
public static void main(String[] args){
Program2 obj = new Program2();
obj.findMin(12);
System.out.println("Min Value: " + obj.min[12]);
}
}