矩陣連乘問題
演算法思路: 求a[1] 到 a[n] 相乘的最小次數,這個問題是有最優子結構的,可以用區間dp來解決, 我們可以通過加括號來決定矩陣連乘的順序,對於i到j的矩陣相乘,因為每次都是將區間分為倆個部分,所以列舉中間節點 k ,然後找到乙個最小的值,同時記錄乙個分割點k還有這個最小值, st[i][j] = k,f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j] + a[i] * a[j + 1] * a[k +1] ,下面我們用乙個集合表示法來表示一下這個問題
最後dfs找到一條路徑即可
演算法描述:
區間dp,就是先求小區間的最優解,然後逐步合併到大區間的最優解,找狀態轉移方程。f[i][j]一般是表示i~j區間的數字相加的最小代價。每次用變數k將其分成(i~k和k+1~j)兩段
code:
#include#include#include#define inf 0x3f3f3f3f
using namespace std;
const int n = 1100;
int f[n][n];//f[i][j]表示從i到j最小計算量
int st[n][n];// 記錄拆開的位置
int a[n];
void dfs(int l, int r)
int k = st[l][r];
printf("(");
dfs(l, k),dfs(k + 1, r);
printf(")");
} int main()
} }
printf("矩陣連乘的最小次數為 : %d\n",f[1][n]);
printf("過程為 : \n");
dfs(1, n);
return 0;
}
演算法結果:
找零錢問題:
演算法思路:
商品的**為n , 你付 m, 那麼商家要找m - n 元, 現在有100 50 30 10 5 1 讓你求最少的需要找多少張錢。 這個題區域性最優解就是整體最優解,所以用貪心演算法來做, 每次貪心用最大的錢。
演算法描述:
貪心法,指的是從問題的初始狀態出發,通過若干次的貪心選擇而得出最優值(或較優解)的一種解題方法。
其實,從「貪心策略」一詞我們便可以看出,貪心策略總是做出在當前看來是最優的選擇,也就是說貪心策略並不是從整體上加以考慮,它所做出的選擇只是在某種意義上的區域性最優解,而許多問題自身的特性決定了該題運用貪心策略可以得到最優解或較優解。
貪心演算法的基本要素:1.貪心選擇性質。 2,最優子結構
code:
#includeusing namespace std;
int a[110];//記錄需要每種面值的紙幣的個數
int main()
else if(n >= 50)
else if(n >= 30)
else if(n >= 10)
else if(n >= 5)
else
}printf("最少需要找的錢的張數:%d\n",ans);
for(int i = 1 ;i <= 100 ; i++)
}return 0;
}// 每次貪心選擇最大的數值的即可
演算法結果:
找零錢問題
問題描述 我們知道人民幣有1 2 5 10 20 50 100這幾種面值。現在給你n 1 n 250 元,讓你計算換成用上面這些面額表示且總數不超過100張,共有幾種。比如4元,能用4張1元 2張1元和1張2元 2張2元,三種表示方法。輸入有多組,每組一行,為乙個整合n。輸入以0結束。輸出該面額有幾...
找零錢問題
人民幣有1 2 5 10 20 50 100這幾種面值。現在給你n 1 n 250 元,讓你計算換成用上面這些面額表示且總數不超過100張,共有幾種。比如4元,能用4張1元 2張1元和1張2元 2張2元,三種表示方法。輸入有多組,每組一行,為乙個整合n。輸入以0結束。輸出該面額有幾種表示方法。使用動...
找零錢問題
這是一道比較有意思的題,在牛客網網直通bat演算法的題中看到。這裡坐下記錄 題 我們知道人民幣有1 2 5 10 20 50 100這幾種面值。現在給你n元,讓你計算換成用上面這些面額表示且總數不超過100張,共有幾種。比如4元,能用4張1元 2張1元和1張2元 2張2元,三種表示方法。這題是到動態...