演算法提高 動態規劃 買不到的數目

2021-09-12 23:11:24 字數 1519 閱讀 3592

[問題背景]

藍橋杯 歷屆試題 prev-8 買不到的數目

問題描述

小明開了一家糖果店。他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。

小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。

你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。大於17的任何數字都可以用4和7組合出來。

本題的要求就是在已知兩個包裝的數量時,求最大不能組合出的數字。

輸入格式

兩個正整數,表示每種包裝中糖的顆數(都不多於1000)

輸出格式

乙個正整數,表示最大不能買到的糖數

樣例輸入1

4 7樣例輸出1

樣例輸入2

3 5樣例輸出2

[思路分析]

考慮一下,記兩個正整數分別為a和b,且a  < b,待組合的為i。

能被a和b組合出的 i 只有這樣幾種可能:

可能一:全部由a組成:記為x(a)

可能二:全部由b組成:記為y(b)

可能三:既有a,又有b:顯然,如果a個數比b個數多,那麼有x(a+b) + y(a); 如果b個數比a個數多,那麼有x(a+b) + y(b)

對於幾種可能的判定:

可能一:i % a == 0 為 true

可能二:i % b == 0 為 true

可能三:將 i 不斷減去(a+b),總會轉化為可能一或者可能二。(此處遞迴)

另外,當 i = a + b時,減去(a+b)會變成0,這個點注意一下。

不滿足能被a和b組合的數可以記為m = x(a+b)+c,其中0 < c < a+b, x = m / (a+b), c = m % (a+b)

這個數不斷減去(a+b),最終 m - x(a+b) = c, 0 < c < a+b

這時看c能否轉化為可能一或者可能二,如果還不能,則再減一次(a+b),c就為負數,那麼c就無法轉化為可能一或者可能二,這時的m就是無法被a和b組合的數,輸出false

[**求解]

#include using namespace std;

bool iscapable(int i, int a, int b) else

}int main ()

} return 0;

}

以下是三個官方測試點:

input1

10 13
input2

30 41
input3

257 191
[方法總結]

可能算不上動態規劃,大概屬於分類剪枝。。。有空我再研究研究

沒有解決的空白是:

是否存在這樣的數m, m > a*b, 且m不屬於上述三種可能?(這個組合不了的數會比 a*b 大嘛?)

藍橋杯 買不到的數目(動態規劃)

判斷乙個數i和m,n的大小,如果大於等於任意乙個,然後再去判斷i m或i n是否能夠用m,n來表示 因此需要開乙個陣列,從i 1開始遍歷。然後再倒著從max來找最大不能表示的。注意這個max是怎麼得出來的,1000000可以,100000也可以 includeusing namespace std ...

買不到的數目

小明開了一家糖果店。他別出心裁 把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。大於17的任何數字都可以用4和7組合出來。本題...

買不到的數目

小明開了一家糖果店。他別出心裁 把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。大於17的任何數字都可以用4和7組合出來。本題...