首先是簡單學習了一下動態規劃中的兩種思想:
1 自頂向下備忘錄 2 自底向上
然後在此基礎上面,針對菲波那切數列進行試驗(之後再實現一下,這類演算法的其他經典情景)。
這裡定義了一些函式:
前面兩個函式是用來實現自頂向下,最後乙個實現自底向上。
具體實現如下:
通過觀察執行結果,可以發現這兩種效率更高一些。#define _crt_secure_no_deprecate
/* vs2010 error
scanf的宣告在vs中被認為是不安全的,讓你使用scanf_s來代替。只要在#include 前面新增
#define _crt_secure_no_deprecate
*/#include#include#includeint getthefabonacci(int number);
int fib(int number , int *temp);
int thesecondway(int thenumber);
////int getthefabonacci(int number)
//// if(number == 1 )
// // return getthefabonacci(number - 1) + getthefabonacci(number - 2);
//} //採用動態規劃的方式 之一 : 自頂向下的備忘錄法 -- 可以利用陣列,來儲存相應的數值,減少計算次數
int getthefabonacci(int number)
/*合法的情況下面,可以建立陣列
這裡採用malloc 動態記憶體分配的方式進行陣列的建立*/
temp = (int *)malloc((number+1) *sizeof(int)); //向系統請求一定記憶體的空間 number + 1
/* 然後分別賦值 為 -1 或者一些特殊數值*/
for(i = 0 ; i<= number ; i++)
// memset(temp,0,number);
return fib(number, temp); //呼叫
}int fib(int number , int *temp)
if(number <= 2)
else
return temp[number];
}// the second way
int thesecondway(int thenumber)
// 首先根據thenumber 的大小 進行相應的位址劃分
temp = (int *) malloc((thenumber + 1 )*sizeof(int));
temp[0] = 0;
temp[1] = 1;
// 剩下的資料就是動態的根據thenumber的資料大小進行計算
for (i =2 ; i<= thenumber ; i++)
return temp[thenumber];
}int main()
getchar();
printf("當前的菲波那切數列的總和為 : [ %d ] \n", getthefabonacci(thenumber));
printf("驗證資料為 : [ %d ]\n",thesecondway(thenumber));
} return 0;
}
學習參考部落格:
0 1揹包問題的兩種動態規劃演算法思想
name 0 1揹包問題的兩種動態規劃演算法思想 author 巧若拙 date 07 03 17 15 30 description 給定n中物品和乙個容量為c的揹包,物品i的重量為wi,其價值為vi,0 1揹包問題是如何選擇裝入揹包的物品 物品不可分割 使得裝入揹包的物品的價值為最大。1.題目分...
動態規劃演算法的基本思想 演算法 動態規劃
演算法 動態規劃 首先學習動態規劃,我們要先知道什麼是動態規劃?演算法導論這本書是這樣介紹這個演算法的,動態規劃與分治方法類似,都是通過組合子問題的解來來求解原問題的。再來了解一下什麼是分治方法,以及這兩者之間的差別,分治方法將問題劃分為互不相交的子問題,遞迴的求解子問題,再將它們的解組合起來,求出...
動態規劃演算法
一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...