打表法 買蘋果問題

2021-10-19 10:56:28 字數 1329 閱讀 1515

【題目】小虎去附近的商店買蘋果, 奸詐的商販使用了**交易, 只提供6個每袋和8個每袋的包裝包裝不可拆分。 可是小虎現在只想購買恰好n個蘋果, 小虎想購買盡量少的袋數方便攜帶。 如果不能購買恰好n個蘋果, 小虎將不會購買。 輸入乙個整數n, 表示小虎想購買的個蘋果, 返回最小使用多少袋子。 如果無論如何都不能正好裝下, 返回-1。

打表法的幾個優點:

(1)在程式中一次性計算出需要的結果,之後直接查詢,一般情況下,q次查詢的時間複雜度只需要o(n+q);

(2)對於一些題目,資料範圍非常大,可以暴力計算小範圍資料結果,然後找規律。

打表法具有 快速,易行(可以寫暴力列舉程式)的特點, 缺點是**可能太大,或者有些情況沒有覆蓋完。

1.先使用一般的解法遍歷出一定範圍內輸入與輸入的聯絡,觀察規律。

2.使用打表法將輸入情況的結果用**表示得到對應的輸出,降低時間複雜度。

public

class

} system.out.

println

(flag);}

/*小虎去附近的商店買蘋果, 奸詐的商販使用了**交易, 只提供6個每袋和8個

每袋的包裝包裝不可拆分。 可是小虎現在只想購買恰好n個蘋果, 小虎想購買盡

量少的袋數方便攜帶。 如果不能購買恰好n個蘋果, 小虎將不會購買。 輸入乙個

整數n, 表示小虎想購買的個蘋果, 返回最小使用多少袋子。 如果無論如何都不

能正好裝下, 返回-1。*/

public

static

int(

int n)

//超過24個的話就不用再算

int bag8 = n /8;

int bag6 =0;

int wait = n %8;

//表示被8的袋子裝完之後剩餘的蘋果

while

(wait <

24&& bag8 >=0)

else

}return-1

;}

可以通過打表法時間複雜度優化為o(1)

public

static

intminbagawesome

(int n)if(

(n &1)

!=0)if

(n <18)

else

if(n ==

2|| n ==

4|| n ==10)

else

}return

(n -18)

/8+3

;}}

素數篩法打表

篩法打素數表是一種高效的打表方法,具體做法是 先把n個自然數按次序排列起來。1不是質數,也不是合數,要划去。第二個數2是質數留下來,而把2後面所有能被2整除的數都劃去。2後面第乙個沒劃去的數是3,把3留下,再把3後面所有能被3整除的數都劃去。3後面第乙個沒劃去的數是5,把5留下,再把5後面所有能被5...

打表法簡單舉例

有時候在資料太多的時候且要多次迴圈的時候,可以選擇打表法,程式設計效率大大提高,下面簡單介紹一下打表法 打表法,顧名思義,就是把一些資料列印出來,存放到陣列裡,需要的時候直接呼叫就行,就不必多次迴圈了。例 如果x加上x的各個位數上的數字之和得到y,就說x是y的生成元。給出n 1 下面看看 inclu...

素數打表 篩法

打表 是一種典型的用空間換時間的做法,一般指將所有可能需要用到的結果事先計算出來,這樣以後後面需要用到時就可以直接查表獲得。在什麼情況下我們需要打表?1 在程式中一次性計算出所有需要用到的結果,之後查詢直接取這些結果。舉個例子,假如我們算fibonacci數中的f n 我們假如需要算很多次q次 比如...