問題描述
媽媽給小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 最多可以拿多少...