#4051. 買不到的數目

題目來源:

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

相關文章
相關標籤/搜索