http://www.51cpc.com/problem/4051html
小明開了一家糖果店。他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。 小朋友來買糖的時候,他就用這兩種包裝來組合。固然有些糖果數目是沒法組合出來的,好比要買 10 顆糖。 你能夠用計算機測試一下,在這種包裝狀況下,最大不能買到的數量是17。大於17的任何數字均可以用4和7組合出來。 本題的要求就是在已知兩個包裝的數量時,求最大不能組合出的數字。ide
輸入兩個正整數函數
輸出不能最大組合的數字測試
Sample inputui
4 7
Sample Outputspa
17
像要你求最大,最小之類的題目大多數都是有技巧而言的,例如咱們之後會碰到的貪心、動態規劃、數論等思想。因此說咱們要用數學的思惟去找出最簡單的方法。code
要是硬解的話網上也有一大堆題解和對於數論公式的證實,那我從新寫一遍也沒什麼意義了。htm
我是初學者,數論什麼什麼的都不知道,我只是隱隱約約的感受到這個應該和什麼公式有關。blog
而後我就用找規律的方法把它寫出來了。get
首先,先暴力一小部分,輸出全部結果,
固然,寫的時候也不是那麼順利,由於存在無解的狀況存在,因此陷入了無限循環,而後我將將那些確定不存在的狀況排除了。
而後就出現了
咱們要尋找的是ans=f(n,m),這樣的函數;
經過不斷試驗發現:ans= n * m - n - m;
那麼咱們直接輸出公式就行了。
#include <stdio.h> bool find(int m, int p, int q) { for(int i=0;i<1000;i++) for (int j = 0;j<1000;j++) if (p * i + j * q == m) return true; return false; } int main() { printf("n\tm\tans\n"); for (int i = 2;i <= 20;i++) for (int j = 2;j <= 20;j++) for (int k = 1000;k >= 0;k--) if (!find(k, i, j)) { if (k >= 999) break; //模擬的時候發現那些無解的數都符合這個條件,因此就用這個將其排除掉。 printf("%d\t%d\t%d\n", i, j, k); break; } return 0; }
#include <stdio.h> int main() { int n, m; scanf("%d %d", &n, &m); printf("%d\n", n * m - n - m); return 0; }
若是您以爲不錯就點個推薦或者收藏吧!
此題爲分支,其根爲:http://www.javashuo.com/article/p-maerkngw-ch.html