[問題背景]
藍橋杯 歷屆試題 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組合出來。本題...