經典演算法之不定方程問題

2021-10-10 23:32:39 字數 2153 閱讀 9047

所謂不定方程,是指未知數個數多於方程個數,且對解都有一定的限制。

首先,來看一道經典的數學問題「百錢買雞」問題。

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

意思是:公雞5文錢1只,母雞3文錢1只,小雞3只1文錢,要求100文錢買100隻雞,求公雞、母雞和小雞應該各買多少只?

其實這是一道不定方程問題,有兩個條件:一是用的錢數正好是100文;二是買雞的數量正好是100只。設買公雞、母雞和小雞分別為x、y、z只,則可列出一下方程:

x+y+z = 100

5x+3y+z/3 = 100

根據這兩個公式,通過計算機的窮舉演算法即可求得結果。

**一:

void buychicken()

} }}

以上的演算法並不是最佳的,深入分析,4只公雞值20文錢,3只小雞值1文錢,合起來雞數是7,錢數是21;而7只母雞的錢數也正好是21.如果少買7隻雞,就可以用這筆錢多買4值公雞和3只小雞。這樣,百錢還是百錢,百雞還是百雞。所以,只要求出乙個答案,根據這個規則,馬上就可以求出其他的答案出來。

設乙個引數看,則有:

x = 4k;

y = 25 - 7k;

z = 75 + 3k;

因為雞的數量x、y、z都只能是正數,所以滿足式子的k值只能是0、1、2、3.

**二:

void buychicken2()

}

其次,還有大家都非常熟悉的趣味數學題「雞兔同籠」問題。

問題的描述是:有若干只雞兔同在乙個籠子裡,從上面數,有35個頭;從下面數,有94隻腳。求籠子中有多少隻雞和多少只兔?

這個問題用窮舉法可以解決,設有雞x只,兔y只,則有方程:

x + y = 35;

2x + 4y = 94;

**三:

void chook_rabbit()

}}

仔細分析,還有更簡單的方法,用奧數中的知識:

將每個頭都按2只算(則認為都是雞),則剩下的足就是兔子的另兩隻,則只需要將剩下的足除以2即可得到兔子的數量。

**四:

void chook_rabbit1()

最後再來看一道著名的「五家共井」問題。

問題的描述:今有五家共井,甲二綆不足如乙一綆,乙三綆不足如丙一綆,丙四綆不足如丁一綆,丁五綆不足如戊一綆,戊六綆不足如甲一綆。如各得所不足一綆,皆逮。問井深、綆長幾何?(題中:「綆」是汲水桶上的繩索,「逮」是到達井底水面的意思。)

意思是:現在有5家共用一口井,甲、乙、丙、丁、戊5家各有一條繩子打水,設各家繩子的長度分別為len1,len2,len3,len4,len5,井深len,則以上條件可以表示為下面的方程:

len1*2+len2 = len;

len2*3+len3 = len;

len3*4+len4 = len;

len4*5+len5 = len;

len5*6+len1 = len;

求井的深度和各家打水所用繩子的長度。

根據上面的方程可得到一下算式:

len1*2 + len2 = len2*3+len3 = len3*4+len4 = len4*5 +len5 = len5*6+len1

由以上算式可以推出:

len1 = len2 + len3/2

len2 = len3 + len4/3

len3 = len4 + len5/4

len4 = len5 + len1/4

根據以上列出的這些算式,可列舉各種情況,最後得出結果。

**五:

void length()

} len = 2*len1 + len2;

printf("各家井繩長度分別為:\n");

printf("甲:%d\n",len1);

printf("乙:%d\n",len2);

printf("丙:%d\n",len3);

printf("丁:%d\n",len4);

printf("戊:%d\n",len5);

printf("井深:%d\n",len);

}

不定方程問題 經典案例「白文買百雞「

百雞問題是乙個數學問題,出自中國古代約5 6世紀成書的 張邱建算經 是原書卷下第38題,也是全書的最後一題,該問題導致三元 不定方程 組,其重要之處在於開創 一問多答 的先例。今有雞翁一,值錢伍 雞母一,值錢三 雞鶵三,值錢一。凡百錢買雞百隻,問雞翁 母 鶵各幾何?答曰 雞翁四,值錢二十 雞母十八,...

經典演算法之 揹包問題

問題描述 有乙個揹包容量為m,一堆物品其重量表示為w 物品相應的價值v 現在要求將物品中的一部分或全部,放入揹包。要求 裝入物品的總價值最高 同時滿足裝入物品總重量不超過m 對單個物品而言,狀態可為 裝入揹包 不裝入揹包 一部分裝入揹包。假設裝入的物品為從w i 到w j 則有 對於完全揹包而言,我...

經典演算法之八皇后問題

問題描述 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。下面利用回溯法 遞迴寫法 來求出所有可能的結果 include include include in...