C++第11周專案2(1)參考——百錢百雞
阿新 • • 發佈:2018-12-21
【專案2:窮舉法解決組合問題】先閱讀例題,領會窮舉法(意為“窮盡式列舉”,也稱列舉)的思想,然後自行選題進行解決,掌握這種程式設計的一般方法。
任務:利用窮舉的方法解決下面的問題(選做一道即算完成任務,其他可以抽時間自由安排,多做會使你更聰明。)
(1)百錢百雞問題:中國古代數學家張丘建在他的《算經》中提出了著名的“百錢買百雞問題”:雞翁一,值錢五,雞母一,值錢三,雞雛三,值錢一,百錢買百雞,問翁、母、雛各幾何?
提示:設雞翁、雞母、雞雛的個數分別為x,y,z,題意給定共100錢要買百雞,若全買公雞最多買20只,顯然x的值在0~20之間;同理,y的取值範圍在0~33之間,可得到下面的不定方程:
5x+3y+z/3=100
x+y+z=100
所以此問題可歸結為求這個不定方程的整數解。
由程式設計實現不定方程的求解與手工計算不同。在分析確定方程中未知數變化範圍的前提下,可通過對未知數可變範圍的窮舉,驗證方程在什麼情況下成立,從而得到相應的解。
引申:這類求解不定方程的實現,各層迴圈的控制變數直接與方程未知數有關,且採用對未知數的取值範圍上窮舉和組合的方法來複蓋可能得到的全部各組解。如果要採取技巧,往往是根據題意,更合理地設定迴圈控制條件來減少這種窮舉和組合的次數,提高程式的執行效率,需要具體問題具體分析。
#include <iostream>using namespace std;int main(){ int x,y,z; //定義資料型別為整型,買雞和買烤雞不是一個概念 for(x=0;x<=20;++x) for(y=0;y<=33;++y) //窮舉中。。。。 for(z=0;z<=300;++z) if(5*x+3*y+z/3==100 && x+y+z==100 && z%3==0) { cout<<"雞翁"<<x<<"只,雞母"<<y<<"只,雞雛"<<z<<"只。"<<endl; } return 0;}
執行結果:
改進一:
#include <iostream>using namespace std;int main(){ int x,y,z; //定義資料型別為整型,防止出現買烤雞情況的出現 for(x=0;x<=20;++x) for(y=0;y<=33;++y) for(z=0;z<=300;z+=3) //既然z要整除3,每次自加3去保證,少了迴圈,也少了判斷 if(5*x+3*y+z/3==100 && x+y+z==100) { cout<<"雞翁"<<x<<"只,雞母"<<y<<"只,雞雛"<<z<<"只。"<<endl; } return 0;}
改進二:
#include <iostream>using namespace std;int main(){ int x,y,z; for(x=0;x<=20;++x) for(y=0;y<=33;++y) { z=100-x-y; //雞雛數就此確定,何須再去試探——窮舉只是笨辦法,人可以讓計算機輕鬆些 if(5*x+3*y+z/3==100&&z%3==0) cout<<"雞翁"<<x<<"只,雞母"<<y<<"只,雞雛"<<z<<"只。"<<endl; } return 0;}