蠻力法策略 列舉

2021-08-13 20:24:03 字數 2416 閱讀 4663

蠻力法是利用計算機執行速度快這乙個特性。把問題所有的情況或所有的過程交給計算機逐一嘗試,從中找出問題的解。

根據問題的條件將可能的情況一 一枚舉起來,逐一嘗試找出問題的解。有時問題的規模太大,可以排除一些明顯不合理的情況。

列舉法的一般規律:

找出列舉範圍:分析問題所涉及的所有情況。

找出約束條件:分析問題的解需要滿足的條件,並用邏輯表示式解釋。

對列舉法的優化主要是對約束範圍和約束條件的數學優化。

問題:

我國古代數學家張丘建在《算經》一書中提出的數學問題:雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、雞母、雞雛各幾何?

分析:隱含約束條件:z%3 = 0,因為雞肯定是整隻的(肯德雞除外)。所以雞仔的個數是3的倍數。

演算法:注意:計算機中遇到除法要小心!

/*

name:

author:

date: 20/12/17

17:26

description:

百錢百雞問題

*/#include

#include

void two()}}

printf("-----\n");

} int main()}}

}system("pause");

return

0;}

百錢百雞的數學優化

問題:

解算式迷:

a b c a b

x a

--------------

dddd

dd

分析:

不同的列舉物件,演算法的效率不一樣。

演算法:

/*

name:

author:

date: 20/12/17

18:06

description:

解算式迷:

a b c a b

x a

--------------

d d d d d d

*/#include

#include

//選擇不同的列舉物件,演算法效率有顯著的差別,列舉物件可以從各個角度去考慮

void two()}}

} } int main()

if(i==6)}}

}system("pause");

return

0;}

問題:

求出三個數字的最小公倍數。

分析:最小公倍數的定義是:乙個整數的所有倍數中最小的乙個。在問題規模很小的時候,可以選擇三個數中最大的列舉其倍數,判斷是否是其他兩個數的倍數,最小的乙個就是三個數的最小公倍數。

演算法:

/*

name:

author:

date: 20/12/17

19:03

description:

暴力列舉三個數的最小公倍數

*/#include

#include

int main()

} system("pause");

return

0;}

問題:

某國王對囚犯進行大赦,讓一獄吏n次通過一排鎖著的n間牢房,每通過一次,按所定規則轉動n間牢房中的某些門鎖, 每轉動一次, 原來鎖著的被開啟, 原來開啟的被鎖上;通過n次後,門鎖開著的,牢房中的犯人放出,否則犯人不得獲釋。

轉動門鎖的規則是這樣的,第一次通過牢房,要轉動每一把門鎖,即把全部鎖開啟;第二次通過牢房時,從第二間開始轉動,每隔一間轉動一次;第k次通過牢房,從第k間開始轉動,每隔k-1 間轉動一次;問通過n次後,哪些牢房的鎖仍然是開啟的?

輸入 獄吏通過牢房的次數n和牢房的間數n(n<=32767)。

輸出:被釋放的犯人的房間號

分析:題目中鎖的狀態只有兩個:開 關,可以用一維陣列來模擬鎖的狀態。

使用數**算模擬開關鎖:a[i] = 1-a[i]

列舉問題中所有的過程,最終的狀態就是問題的解。

演算法:

/*

name:

author:

date: 20/12/17 19:03

description:

獄史問題

*/#include

#include

int main()

//把所有可能的過程列舉出來

for(int i=1;i<=n;i++)

}for(int i=0;iif(a[i]==0)

}system("pause");

return

0;}

蠻力法習題

1.分式化簡。設計演算法,將乙個給定的真分數化簡為最簡分數形式。例如將6 8化簡為3 4。include using namespace std int mincommonfactor int a,int b 求最小公因數 int main cout 最簡真分數是 2.設計演算法,判斷乙個大整數能否...

列舉法(蠻力思想)和回溯法列出所有彩票號碼

現在有這樣乙個問題 假設彩票號碼有七注,每一注是從1 29的數字中的乙個,每一注數字不能和其他注的重複。現在寫出所有可能的號碼。可以採用列舉法,使用蠻力的思想來解決問題。使用迴圈遍歷來輸出所有可能的結果,這種方法言簡意賅,能直接想到,但是迴圈層數過大,時間複雜度過大,執行時間較長。也可以採用試探法,...

演算法複習 蠻力法

一.定義 蠻力法是一種簡單直接解決問題的方法,常常直接基於問題的描述和所涉及的概念定義。二.蠻力法的用處 a.和其他策略不同,我們可以用它解決廣闊領域的各種問題,實際上,它可能是唯一一種什麼問題都能解決的一般性方法。b.對於一些重要的問題 例如 排序,查詢,矩陣乘法和字串匹配 來說,蠻力法可以可以產...