第一種解法:dp(感覺不像)
> 思想:本題是找按價值均分大理石的方案是否存在,由於分配時不能破壞大理石,所以有個顯而易見的剪枝:當所有的大理石的總價值為奇數時肯定不能被均分。把 問題轉化一下即:由乙個人能否從原大理石堆中取出總價值為原來一半的大理石,本題的主要演算法是動態規劃,陣列flag代表狀態,設總價值為sum.當 flag[k]==true時,說明,可以有一人獲得價值k,另外一人獲得價值v-k的大理石分配方案。反之若flag[k]=false說明這種分配方 案不存在.我們的任務就是計算出flag[sum/2]是true還是false,顯然有flag[0]==true的方案存在,即乙個人什麼都不分,另 外乙個人拿走全部的大理石.
> 設i(1<<6)為石頭的價值,試想若flag[k]==true,如果能再向k中增加一價值為i的大理石,則 flag[k+i]==true必然成立.石頭有兩個屬性,乙個是價值另乙個是數量,這裡array[i]代表價值為i的大理石的數量,我們根據其中乙個 屬性:價值來劃分階段。即for (int i=1;i<=6;i++),flag[k]表示狀態是否存在(這裡的狀態是指能否從原石頭堆中分出價值為k的新石頭堆)。在初始階段是i=1,初 始狀態是flag[0]=true,max代表目前滿足flag[k]==true這一條件的k的最大值。
> for(int j=max;j>=0;j--)
> //從當前最大值flag開始,根據前面提到的flag[j]==true成立則flag[j+i]==true亦成立的理論,在原有狀態flag[j]==true已存在的條件下加入stone[i]階段的石頭,得到新的狀態。。**的思路)
其中discuss 裡面的one the method 沒看懂。。
第二種解法:多重揹包。。(有待研究)
poj 1014 硬幣分割
poj 1014 經典多重揹包問題 by baiwenlei 題目大意 給出一些價值在1 6範圍間的彈珠,判斷是否能夠按照價值等分 解題思路 多重揹包問題,不過本題中若價值不是偶數,直接返回即可 最後注意輸出的時候要求case之間有乙個空行,最後乙個case結束以後不空行。否則presentatio...
POJ 1014 解題報告
這道題我用的是最原始的dfs,雖然加了cache,避免了一些重複運算,但不出意料地tle了。然後就是 優化 把每個value中的item個數減到200以下 看discuss可以取到30甚至6的,還有一堆mod的解法 我都不明白這些優化的原理。見源 中注釋掉的dfs部分。1014 accepted 3...
POJ1014 多重揹包
今天開始dp了,第一道多重揹包,模板題,還是想了很久,太弱了 題意 一行給出6個數,表示從1到6,6個不同權值的個數.求能否將所有權值不分割的分成權值相等的兩份.首先總權值為奇數的肯定不符合要求,接下來就是乙個多重揹包了.多重揹包的二進位制拆分我的理解大概是 首先將乙個數按二進位制拆分之後可以用拆分...