窮舉算法實現百元買百筆

窮舉算法實現百元買百筆

一、 窮舉算法原理

窮舉也稱枚舉,是最常用的算法之一,它的基本思想是—列舉各種可能進行的測試,從中找出符合條件的解。計算機能夠實現高速運算,是由於它藉助於循環結構實現窮舉,它比人工操作更爲有效。

儘管計算機能夠實現高速運算,但設計窮舉算法時,仍希望儘量縮小窮舉的規模。或者說,在保證思路嚴謹、清晰、有條理、不漏解的前提下,儘量減少窮舉的規模。

二、算法實現

一百元買一百隻筆,其中鋼筆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+"次");
運行結果

在這裏插入圖片描述

結果分析
  1. 循環次數太多,若將此類循環寫入一個大型腳本語言中,勢必會增加計算機的負擔;

  2. 鉛筆一元買三根,卻運行結果中出現了除不盡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+"次");
運行結果

在這裏插入圖片描述

結果分析
  1. 運行結果正確;

  2. 循環次數仍然太多,應在取值範圍上進行壓縮。

優化代碼

當買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+"次");
運行結果

在這裏插入圖片描述

結果分析
  1. 循環次數較多。
優化代碼

觀測結果可知,鉛筆每次多買三根,此時買鋼筆和圓珠筆的錢可多出一元。而鋼筆和圓珠筆每次的數量應減少三。

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+"次");
運行結果

在這裏插入圖片描述
運行結果顯示正確,且只循環了四次!

總結

窮舉法雖然對計算機來說很容易,計算機可以實現一秒百萬級次的運算,但是如若在大型程序中,可以將多個幾百萬次的循環語句進行壓縮到幾次、幾十次,那麼將可以大大增加計算機的運行效率,減少了計算機的負擔也節省了空間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章