任何人都可以解释我这段代码

时间:2015-03-16 09:05:34

标签: algorithm

// 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)

我无法理解代码。

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]);
    }
}