Previous Blog We talked about the division of the law, followed by the dynamic planning method: Dynamic Programming and division of the same method, it is to solve the problem of decomposition into sub-problem, the optimal solution , the difference is that if the decomposition of the sub-problem has a lot of the same, using the same sub-treatment method of the same problem will be solved many times , it affects the efficiency; dynamic programming, it will save the answers to the sub-problems solved , and then have the same sub-problem directly with the saved answer on the line, saving a lot of computational time.
As a picture shows:
Cases:
Solution: We ask first F (5) the solution, as below, is represented by the structure of a two-fork tree
through the binary tree, we notice that F (n) is through computes its two overlapping sub-problems F (n-1) and F (n-2) in the form of a representation, so that a table can be designed to fill in n+1 f (n) values. The following table finds: The last number equals the sum of the preceding two digits. (This is the famous Fibonacci number)
Therefore, using the dynamic programming method, the properties of a problem can be summarized as: Optimal substructure, overlapping sub-problem
Applicable situation:
(1) Optimization principle: If the optimal solution of the problem contains sub-problem solution is also optimal, it is said that the problem has the optimal sub-structure, that is, to meet the optimization principle.
(2) No effect: that is, once a stage state is determined, it is not affected by the decision after this state. In other words, the subsequent process of a State does not affect the previous state, only the current state.
(3) There are overlapping sub-problems: That is, sub-problems are not independent, a sub-problem in the next stage of decision-making may be used more than once. (This nature is not a necessary condition for dynamic programming, but without this nature, the dynamic programming algorithm has no advantage over other algorithms)
application Examples:
<span style= "FONT-SIZE:14PX;" > public class Coinschange {/** * coin change: Dynamic Programming Algorithm * * @param values * : An array that holds the value of each type of coin * @param valuekinds *: Number of coins of different currencies, i.e. coinvalue[] array size * @ Param Money *: The face value of the change required * @param coinsused *: The minimum number of coins required to save the change of banknotes with a face value of I */public static void Makechange (int[] values, int valuekinds, int. money, int[] coinsused) { Coinsused[0] = 0; For every penny of the change, that is, the solution to save the sub-problem to spare, that is, fill in for (int cents = 1; cents <=; cents++) {//When using the minimum currency value Coins to find the maximum number of coins required int mincoins = cents; Traverse each denomination of the coin to see if it can be used as one of the change for (int kind = 0; kind < valuekinds; kind++) { If the current value of the coin is less than the current cents then the problem is decomposed and the table is checked if (Values[kind] <= cents) { int temp = Coinsused[cents-values[kind]] + 1; if (Temp < mincoins) {mincoins = temp; }}}//save minimum number of coins coinsused[cents] = mincoins; System.out.println ("+ (cents) +" minimum number of Coins: "+ coinsused[cents]); }} public static void Main (string[] args) {//Coin value pre-sorted in descending order int[] Coinvalue = new int[] {25, 21, 10, 5, 1}; The face value of the change required int money = 63; Save the minimum number of coins required to change each face value, Unit No. 0 is discarded, so add 1 int[] coinsused = new Int[money + 1]; Makechange (Coinvalue, Coinvalue.length, Money, coinsused); }} </span>
Dynamic programming method of common algorithm