2020 7 16集訓總結

2021-10-08 04:48:28 字數 1459 閱讀 2177

(1)01揹包:狀態方程(二維):

dp[i][j]=max(dp[i-1][j],dp[i-1][j-m[i]]+v[i]) (j>=m[i])

方程中dp[i-1]可刪去簡化變成一維,dp[j]=max(dp[j],dp[j-m[i]]+v[i])。

注意:二維方程需要if判斷條件,但是一維不需要,

(2)完全揹包:就是拿物品次數變成無數次。

狀態方程:dp[i][j]=max(dp[i-1][j],dp[i-1][j-k*m[i]]+k *v[i])(0<=k * m[i]<=j)

(3)多重揹包:有限次的拿物品。

狀態方程:dp[i][v] = max

附上今天刷的一道題 hdu - 1171

題目大意,有n個價值物品,每個價值物品可能有1個以上,要求平均分成兩份,第乙份大於等於第二份。

這道題兩種方法:第一種,均分01揹包,第二種方法多重揹包。

我用的均分01揹包。

大概思路:所有價值總和除2就是一分最小價值(第二份)

直接01揹包完成

#include

#include

#include

#include

using

namespace std;

int t,m[

255555

],number,num,sum,dp[

255555];

intmax

(int x,

int y)

intmain()

int n=sum/2;

for(

int j=

1;j)for

(int i=

0;i<=n;i++)if

(i>=m[j]

) dp[i]

=max

(dp[i]

,dp[i-m[j]

]+m[j]);

printf

("%d %d\n"

,sum-dp[n]

,dp[n]);

}return0;

}

有點坑的就是陣列範圍是5050100。。我開的5005一直超時。。。很神奇居然不是runtime。

今天還學習了搜尋,dbfs這個就是2個bfs雙向比乙個bfs時間快,空間小。

還有看懂了a演算法,實現就是有點難,用它解決八數碼問題。

a演算法靈魂 f(x)=h(x)+g(x)

h(x)就是估算距離。有很多估算思想我就會乙個m開頭的

g(x)就是自己設定距離一般乙個方塊10,對角線14(約等於),數值看自己愛好。

每次找路是找f(x)最小值,所以它的缺點就很明顯如果有多個f(x)最小值尋路,那麼他不一定找到的是最短路。

然後a=演算法公升級版就是ida演算法,就是限制層數的a演算法,看部落格說極其優化,簡單的公式。。。。。

(7 6 7 20)集訓總結

電腦鍵盤莫名出鍋,打字真的不易,所幸之前已經寫了一篇 關於最近 7.6 7.20 集訓的乙個總結 個人認為集訓最有意義的是模擬賽吧,畢竟這麼多人一起。對於模擬賽略做分析?廢話較多 加粗的比較有價值?首先有幾次的模擬賽有些頹廢,後來想起來覺得挺惋惜的。有時候看一會覺得沒有什麼思路,就比較頹,覺得就這樣...

2019 7 22集訓總結

今天上午看了位運算的部分知識,複習了以前看過的遞迴,學習了快速冪,對書上的例題深入挖掘了一下,下午把 熟悉了好幾遍,看懂了位運算在快速冪中的應用。晚上打了比賽,讓我意識到自己和別人的差距,還有很長的路要走。堅持下去的才是勝利者,心態的問題,計畫的問題,都是我要不斷改進的問題。不管怎麼樣,放手去幹,下...

2019 8 1集訓總結

今天上午還是補了題目,又花了不少時間,雖然有很多收穫,但是一想到書上的知識還沒消化就發愁。趕緊看書,把時間最大化的利用起來。下午看了鍊錶,看了一會又去vjudge上做了幾道題目,感覺對技巧列舉和遞推公式有了更進一步的認識。利用已知條件結合簡單數學知識推導公式,這很重要,我雖然不是數學專業的,但是,多...