試題 演算法提高 拿糖果

2021-10-18 15:10:54 字數 1831 閱讀 8813

問題描述

媽媽給小b買了n塊糖!但是她不允許小b直接吃掉。

假設當前有m塊糖,小b每次可以拿p塊糖,其中p是m的乙個不大於根號下m的質因數。這時,媽媽就會在小b拿了p塊糖以後再從糖堆裡拿走p塊糖。然後小b就可以接著拿糖。

現在小b希望知道最多可以拿多少糖。

輸入格式

乙個整數n

輸出格式

最多可以拿多少糖

樣例輸入

15樣例輸出

6資料規模和約定

n <= 100000

思路:

此題意思就是我每次拿糖可以拿p塊糖,但是p是m的乙個不大於根號下m的質因數,我拿後媽媽就會在小b拿了p塊糖以後再從糖堆裡拿走p塊糖。

我們可以假設當我們15塊時第乙個可以拿的範圍就是3 和2 又因為拿的數要是m的質因數所以我們只可以拿3塊.當我們拿完後媽媽又拿走3塊我們就還要9塊,我們在像之前的方法以此類推。

我們可以得出知道題很像完全揹包題,就是多了要滿足m的質因數。所以我們把n當做總量,可以去的質數當作物品。

那我們就可以先把質數的範圍全部儲存起來,在建立應該dp[i] 表示當糖為i塊時,可以拿的最大數。拿我們知道了糖果取值範圍就是0-n ,物品的取值就是100000的根號次方的質數的個數。

題目說了拿糖要不大於根號下m的質因數,所以大於他就就是當前迴圈a[j]>pow(i,0.5) ,當不大於時我們就看看當前的數是不是m的質因數i%a[j]==0。

當我們當前拿了a[j]塊時,我們就當前容量減去拿走的數那麼就是i-2a[j] 因為媽媽有拿了a[j]份,這就是拿了後剩餘份可以拿的最大值,我們在加上當前拿的a[j]。那麼轉移式就是dp[i-2a[j]]+a[j]。

dp[i]=max(dp[i],dp[i-2*a[j]]+a[j]) 要和當前的相互比較。

程式:

n1=

int(

input()

)def

z(s)

:#篩選質數

if s==

2or s==3:

return

1if s==

1or s%2==

0:return

0 k=

1while k*k<=s:

k+=2if s%k==0:

return

0return

1a1=

for i in

range(2

,350):

#篩選100000的根號的質數

if z(i)

:def

ge(a,n)

: dp=[0

for i in

range

(100005)]

#dp[i]當前的最大取值

for i in

range

(n+1):

#糖果數

for j in

range

(len

(a))

:#物品 就是上面篩選的質數

if a[j]

>

pow(i,

0.5)

:#判斷當前質數是否大於糖果的的根號

break

if i%a[j]==0

:# 判斷是否是糖果i的質因數

dp[i]

=max

(dp[i]

,dp[i-

2*a[j]

]+a[j]

)#當前大小於取值後的大小相互比較

return dp[n]

print

(ge(a1,n1)

)

演算法提高 拿糖果

演算法提高 拿糖果 時間限制 1.0s 記憶體限制 256.0mb 問題描述 媽媽給小b買了n塊糖!但是她不允許小b直接吃掉。假設當前有m塊糖,小b每次可以拿p塊糖,其中p是m的乙個不大於根號下m的質因數。這時,媽媽就會在小b拿了p塊糖以後再從糖堆裡拿走p塊糖。然後小b就可以接著拿糖。現在小b希望知...

演算法提高 拿糖果

問題描述 媽媽給小b買了n塊糖!但是她不允許小b直接吃掉。假設當前有m塊糖,小b每次可以拿p塊糖,其中p是m的乙個不大於根號下m的質因數。這時,媽媽就會在小b拿了p塊糖以後再從糖堆裡拿走p塊糖。然後小b就可以接著拿糖。現在小b希望知道最多可以拿多少糖。輸入格式 乙個整數n 輸出格式 最多可以拿多少糖...

演算法提高 拿糖果

問題描述 媽媽給小b買了n塊糖!但是她不允許小b直接吃掉。假設當前有m塊糖,小b每次可以拿p塊糖,其中p是m的乙個不大於根號下m的質因數。這時,媽媽就會在小b拿了p塊糖以後再從糖堆裡拿走p塊糖。然後小b就可以接著拿糖。現在小b希望知道最多可以拿多少糖。輸入格式 乙個整數n 輸出格式5 最多可以拿多少...