百錢買百雞(列舉思想編寫,並進行3次優化)
1.題目
我國古代數學家張丘建在《算經》一書中曾提出著名的“百錢買百雞”問題:雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一;百錢買百雞,則翁、母、雛各幾何?
翻譯過來,意思是公雞一個五塊錢,母雞一個三塊錢,小雞三個一塊錢,問公雞、母雞、小雞各多少隻?
2.列舉法思想解法
2.1 列舉法思路
- 列舉變數:公雞,母雞,小雞對應了i,j,k
- 列舉範圍:公雞,母雞,小雞都是1-100次,對應了i,j,k分別迴圈一百次
- 列舉判斷條件:
- 錢數=100:5公雞+3母雞+1/3小雞=100 對應 5i+3j+k/3 == 100
- 總雞數=00:公雞+母雞+小雞=100 對應 i+j+k == 100
- 小雞必須為整數:小雞%3=0 對應 k%3 == 0
#include<iostream>
using namespace std;
int main()
{
int count = 0;
for(int i = 1 ; i <= 100 ; i++)
{
for(int j = 1 ; j <= 100 ; j++)
{
for(int k = 1 ; k <= 100 ; k++)
{
count++;
if(k%3 == 0 && 5*i+3*j+k/3 == 100 && i+j+k == 100){
cout<<"雞翁"<<i<<"只,雞母"<<j<<"只,雞雛"<<k<<"%d只"<<endl;
}
}
}
}
cout<<"迴圈次數="<<count<<endl;
return 0;
}
看得出來總迴圈次數是1000000次
3.第一次優化:縮小列舉範圍
- 因為一百塊錢總共可以買20只公雞,且母雞和小雞最少一隻,因此公雞的取值範圍可以縮小為1-18也就是1≤i≤18
- 因為一百塊錢最多可以買34只母雞(33.33),且公雞和小雞最少一隻,因此母雞的取值範圍為1≤j≤32
- 因為小雞一元三隻,所以這裡無所縮小,公雞和母雞最少一隻,因此小雞的取值範圍為1-98,也就是1≤k≤98
#include<iostream>
using namespace std;
int main()
{
int count = 0;
for(int i = 1 ; i <= 18 ; i++)
{
for(int j = 1 ; j <= 32 ; j++)
{
for(int k =1 ; k <= 98 ; k++ )
{
count++;
if(k%3 == 0 && 5*i+3*j+k/3 == 100 && i+j+k==100){
cout<<"雞翁"<<i<<"只,雞母"<<j<<"只,雞雛"<<k<<"只"<<endl;
}
}
}
}
cout<<"迴圈次數="<<count<<endl;
return 0;
}
看得出來總迴圈次數是56448次
4.第二次優化:減少列舉變數
- 因為公雞,母雞和小雞的總數是100,所當公雞和母雞確定的時候,小雞就可以用總數減去公雞,減去母雞來表示也就是k=100-i-j;
#include<iostream>
using namespace std;
int main()
{
int count = 0;
for(int i = 1 ; i <= 18 ; i++)
{
for(int j = 1 ; j <= 32 ; j++)
{
count++;
int k = 100 - i - j;
if(k%3 == 0 && 5*i+3*j+k/3 == 100){
cout<<"雞翁"<<i<<"只,雞母"<<j<<"只,雞雛"<<k<<"只"<<endl;
}
}
}
cout<<"迴圈次數="<<count<<endl;
return 0;
}
看得出來總迴圈的次數是576
5.第三次優化:進一步減少列舉變數
- 先來看三個列舉變數之間的關係
- i+j+k=100
- 5i+3j+k/3=100
利用上述二式,消去k得14i+8j=200–>7i+4j=100
j = (100-7i)/4
k = 100 - (100-7i)/4
- 從7i+4j=100可以推出j最小取1,則4j為4,7i最大為96,故i的取值範圍為1-13
#include<iostream>
using namespace std;
int main()
{
int count = 0;
for(int i = 1 ; i <= 13 ; i++)
{
count++;
int j = (100-7*i)/4;
int k = 100 - j -i;
if( (100-7*i)%4 == 0 && k%3 == 0){
cout<<"雞翁"<<i<<"只,雞母"<<j<<"只,雞雛"<<k<<"只"<<endl;
}
}
cout<<"迴圈次數="<<count<<endl;
return 0;
}
看得出來總迴圈次數減少到了13
大家可以看得出來列舉法的總體思路是比較簡單的並不複雜,所以我們需要儘可能的去優化它。從最開始的1000000優化到最後的13次,可以看出優化的作用,更可以從中體會到演算法的魅力!
4個cpp原始檔下載:點選下載
其實沒必要下載,自己從程式碼框中複製就可以了
相關文章
- python百雞百錢Python
- 第 7 節:流程控制-迴圈練習-百錢百雞
- 小馬識途:百度熱議如何優化?百度熱議優化多少錢?優化
- 百雞問題擴充套件-N雞問題N元錢買N只雞,公雞每隻5元,母雞每隻3元,小雞1元3只,N元錢必須剛好買N只雞,而且雞必須整隻買,不能劈開買。套件
- SDUST 軟體工程2016-作業4-A 百錢買雞問題軟體工程
- 百度百科編寫收費真的嗎 百度百科編寫有代理嗎
- 站群網站如何進行百度優化網站優化
- VC++進行視窗列舉C++
- 利用百度地圖進行地圖定位並實時上傳地圖
- 百度App網路深度優化系列《一》DNS優化APP優化DNS
- 在C#中對列舉進行位運算--列舉組合C#
- 教你更優雅地寫 API 之「列舉使用」API
- 命令列看糗百命令列
- 為Flask編寫1個百度編輯器的外掛Flask
- 使用webmagic爬蟲對百度百科進行簡單的爬取Web爬蟲
- 前端效能優化實踐 之 百度App個人主頁優化前端優化APP
- 百人開燈問題解法及優化優化
- 百度地圖,點聚合展示速度優化地圖優化
- MySQL百分位數計算(優化版)MySql優化
- 左百分號模糊查詢的優化優化
- 百度口碑營銷怎麼搞?百度口碑優化需要做什麼?優化
- 百度百科建立人物詞條多少錢?百科建立的費用解析
- 用javascript編寫簡單銀行取錢存錢流程(函式)JavaScript函式
- C++列舉演算法之雞兔同籠C++演算法
- 正確進行程式碼優化,一點思想論行程優化
- MySQL百分位數計算(再優化版)MySql優化
- 向未來而生:百度的技術進化
- 在LINUX下編寫程式並執行Linux
- 企業百度百科如何建立?小馬識途分享編輯百科的技巧
- 國產AI框架進化!百度Paddle Lite釋出:率先支援華為NPU線上編譯AI框架編譯
- springboot thymeleaf 整合 百度富文字編輯器UEditor進行圖片上傳Spring Boot
- python進行陣列合並的方法Python陣列
- 百度及谷歌搜尋引擎優化初學者指南谷歌優化
- OC中列舉寫法 以及 字串型別列舉實現探索字串型別
- 阿里如何做到線上業務百分百容器化阿里
- 百度百科外鏈指向色情網站怎麼回事 百度:已刪除並全面排查網站
- 百分百自由發行版 Trisquel 4.5 釋出
- 使用列舉來寫出更優雅的單例設計模式單例設計模式