窮舉算法實現百元買百筆
一、 窮舉算法原理
窮舉也稱枚舉,是最常用的算法之一,它的基本思想是—列舉各種可能進行的測試,從中找出符合條件的解。計算機能夠實現高速運算,是由於它藉助於循環結構實現窮舉,它比人工操作更爲有效。
儘管計算機能夠實現高速運算,但設計窮舉算法時,仍希望儘量縮小窮舉的規模。或者說,在保證思路嚴謹、清晰、有條理、不漏解的前提下,儘量減少窮舉的規模。
二、算法實現
一百元買一百隻筆,其中鋼筆5元一根,圓珠筆3元一根,鉛筆1元三根。
首先設鋼筆買i只,圓珠筆買j只,鉛筆買k只。
i、j、k循環次數都爲0—100.
代碼實現
int i,j,k,count=0;
for(i=0;i<=100;i++)
{
for(j=0;j<=100;j++)
{
for(k=0;k<=100;k++)
{
if(5*i+3*j+k/3==100&&i+j+k==100)
System.out.println("鋼筆i="+i+" 圓珠筆j="+j+" 鉛筆k="+k);
count+=1;
}
}
}
System.out.println("總循環了"+count+"次");
運行結果
結果分析
-
循環次數太多,若將此類循環寫入一個大型腳本語言中,勢必會增加計算機的負擔;
-
鉛筆一元買三根,卻運行結果中出現了除不盡3的數,顯然是忽略了某些條件導致結果錯誤。
優化代碼
int i,j,k,count=0;
for(i=0;i<=100;i++)
{
for(j=0;j<=100;j++)
{
for(k=0;k<=100;k=k+3)
{
if(5*i+3*j+k/3==100&&i+j+k==100)
System.out.println("鋼筆i="+i+" 圓珠筆j="+j+" 鉛筆k="+k);
count+=1;
}
}
}
System.out.println("總循環了"+count+"次");
運行結果
結果分析
-
運行結果正確;
-
循環次數仍然太多,應在取值範圍上進行壓縮。
優化代碼
當買0只鋼筆時,j=25、k=75
當買0只圓珠筆時,i=14、k=86
而86%3!=0,即最多隻能買84只鉛筆,此時鋼筆應爲12,圓珠筆應爲4。
int i,j,k,count=0;
for(i=0;i<=12;i++)
{
for(j=4;j<=25;j++)
{
for(k=75;k<=84;k=k+3)
{
if(5*i+3*j+k/3==100&&i+j+k==100)
System.out.println("鋼筆i="+i+" 圓珠筆j="+j+" 鉛筆k="+k);
count+=1;
}
}
}
System.out.println("總循環了"+count+"次");
運行結果
結果分析
- 循環次數較多。
優化代碼
觀測結果可知,鉛筆每次多買三根,此時買鋼筆和圓珠筆的錢可多出一元。而鋼筆和圓珠筆每次的數量應減少三。
54=20 37=21
得出結論:鋼筆以每四隻變化,而圓珠筆以每七根變化。
int i,j,k,count=0;
for(i=0;i<=12;i=i+4)
{
for(j=4;j<=25;j=j+7)
{
for(k=75;k<=84;k=k+3)
{
if(5*i+3*j+k/3==100&&i+j+k ==100)
System.out.println("鋼筆i="+i+" 圓珠筆j="+j+" 鉛筆k="+k);
count+=1;
}
}
}
System.out.println("總循環了"+count+"次");
運行結果
拓展
將三重循環進行壓縮
int i,j,k,count=0;
for(k=75;k<=86;k=k+3)
{
j=200-14*k/6;
i=100-k-j;
System.out.println("鋼筆i="+i+" 圓珠筆j="+j+" 鉛筆k="+k);
count+=1;
}
System.out.println("總循環了"+count+"次");
運行結果
運行結果顯示正確,且只循環了四次!
總結
窮舉法雖然對計算機來說很容易,計算機可以實現一秒百萬級次的運算,但是如若在大型程序中,可以將多個幾百萬次的循環語句進行壓縮到幾次、幾十次,那麼將可以大大增加計算機的運行效率,減少了計算機的負擔也節省了空間。