日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

试题 历届试题 买不到的数目(dp/数学)

發(fā)布時(shí)間:2024/9/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 试题 历届试题 买不到的数目(dp/数学) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

試題 歷屆試題 買不到的數(shù)目


資源限制 時(shí)間限制:1.0s 內(nèi)存限制:256.0MB

$Daily English

曾幾何時(shí),我流連夢境,心比天高,人生充滿希望。
I dreamed a dream in time gone by,when hope was high and life worth living.

問題描述

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

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

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

本題的要求就是在已知兩個(gè)包裝的數(shù)量時(shí),求最大不能組合出的數(shù)字。

輸入格式

兩個(gè)正整數(shù),表示每種包裝中糖的顆數(shù)(都不多于1000)

輸出格式

一個(gè)正整數(shù),表示最大不能買到的糖數(shù)

樣例輸入1

4 7

樣例輸出1

17

樣例輸入2

3 5

樣例輸出2

7

思路

本題蘊(yùn)含了:a與b一定是互質(zhì)的,而且a,b均大于1。
為什么?
(都怪出題人沒有說清楚)
認(rèn)真看題目這段描述:
把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。
小朋友來買糖的時(shí)候,他就用這兩種包裝來組合。

結(jié)合生活實(shí)際,如果a = 4,b = 8,那這個(gè)b 對(duì)商家而言有什么意義?
小朋友完全可以買兩個(gè)a代替一個(gè)b。
如果a,b中有一個(gè)為1,那就一定求不到正整數(shù)結(jié)果,因?yàn)?可以組合出任意的正整數(shù)(廢話)。.

way1 dp:

令dp[i]表示i是否可以由a,b組合得到,
dp[i] = 1 表示可以,dp[i] = 0則表示不可以。
那么對(duì)于一個(gè)數(shù)i,有三種情況:

  • i本身就是a,b中得一個(gè);
  • i 可以由 i - a 加上一個(gè)a或b得到;
  • i 可以由 i - b 加上一個(gè)a或b得到;
  • 所以就有狀態(tài)轉(zhuǎn)移方程:
    假設(shè)a < b,
    i = a 或 i = b 時(shí):dp[i] = 1;
    i < b 時(shí): dp[i] = dp[i-a] ;
    i > b 時(shí): dp[i] = dp[i-a] || dp[i-b];

    有了遞推方程,還需要確定i的上限。
    我們刷題,完全可以把i的上限 根據(jù)時(shí)間復(fù)雜度 設(shè)置為一個(gè)比較大的值,但是不超過時(shí)間復(fù)雜度。
    因?yàn)榭梢栽贠(N)的時(shí)間復(fù)雜度了求解答案,且題目給出a,b不會(huì)超過1000,
    所以我們可以 (再結(jié)合做題經(jīng)驗(yàn) )把i的上限設(shè)置為1e6,或者2e6,5e6等等。。

    但是AC完,我們還是需要認(rèn)真思考一下:i的上限應(yīng)該為多少?該如何來證明它的上限值?

    我思考了很久,沒有很好的思路…只知道上限在a * b范圍內(nèi)。but我無法證明,表示很無奈。。。(暫時(shí)留坑)


    way2 數(shù)學(xué)解法:
    a,b互質(zhì),則a,b最大不能組合出的正整數(shù):ans = a * b - a - b。

    我能力有限,暫時(shí)無法直接證明:ans = a * b - a - b。

    不過看了別人使用反證法證明了a * b - a - b 一定是不能由a,b組合得到的。

    我把反證法證明表述如下:

    假設(shè):a*b-a-b 可以由a,b組合得到,則: a * b - a - b = a * x + b * y ,(x>=0,y>=0)

    a * b = a * (x + 1) + b* (y + 1), x+1>=1,y+1>=1

    可知: a * b > b * (y + 1), b * (y + 1) 一定是a的倍數(shù)

    又因?yàn)?#xff1a; gcd(a,b) = 1,所以:b不可能為a的倍數(shù)

    所以只能是y + 1 為a的倍數(shù),即: y + 1 = k * a ,(k > 0)

    但是這就使:a * b > b * (y + 1) = k * a * b 產(chǎn)生了矛盾,

    所以假設(shè)不成立,即 a * b - a - b 不可以由a,b組合得到。

    此時(shí) 只要證明a,b不能組合出的 最大正整數(shù) < a * b ,

    那么就可以說明:

    a * b - a - b 就是題目ans了。

    代碼

    way1 dp:

    #include <iostream> using namespace std; const int N = 1e6; int dp[N]; int main() {int a,b;cin>>a>>b;dp[a] = dp[b] = 1;int up = a * b;//題意以及結(jié)合生活實(shí)際:a,b一定互質(zhì)if(b < a) a ^= b ^= a ^= b; //交換a,b,保證更小的是aint ans = a - 1;for(int i = a+1; i < up; i++){if(i == b) continue;if(i > b)dp[i] = dp[i-a] || dp[i-b]; //可能+a得到i,或者+b得到ielsedp[i] = dp[i-a]; //只可能+a得到iif(dp[i]) continue;ans = i;}cout<<ans<<endl;return 0; }

    way2:
    code:

    a,b = map(int,input().split()) print(a*b-a-b)

    總結(jié)

    以上是生活随笔為你收集整理的试题 历届试题 买不到的数目(dp/数学)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。